2011-04-23 79 views
1

这必须在Django文档的某处,但我似乎无法找到它。如何在Django中初始化ForeignKey ModelChoiceField?

说我有以下型号:

models.py 

class MyModel(models.Model): 
    name = models.CharField(max_length=15) 

class MyOtherModel(models.Model): 
    title = models.CharField(max_length=50) 
    my_model = models.ForeignKey(MyModel) 

我创造,我改变选择构件的背景颜色的表格:

forms.py 

class MyOtherModelForm(ModelForm): 
    my_model=ModelChoiceField(queryset=MyModel.objects.all()) 

    class Meta: 
     model = MyOtherModel 

    def __init__(self, *args, **kwargs): 
     super(MyOtherModelForm, self).__init__(*args, **kwargs) 
     self.fields['my_model'].widget = Select(attrs={'style':'background_color:#F5F8EC'}) 

一切运行正常,直到背景颜色代码添加。只要我添加该行,就会出现一个有色但未填充的选择小部件。我认为这是因为一旦我指定了部件行为的某个方面,Django正在寻找所有需要指定的部分。

那么如何告诉它使用MyModel中的值来填充Select小部件?

回答

3

看看Overriding the default field types or widgets。基于此,我会尝试以下。

from django.forms import ModelForm, Select 

class MyOtherModelForm(ModelForm): 
    my_model=ModelChoiceField(queryset=MyModel.objects.all(), widget=Select(attrs={'style':'background_color:#F5F8EC'})) 

    class Meta: 
     model = MyOtherModel 

还加入self.fields [ 'my_model']。查询集= MyModel.objects.all()到您的初始化也可能会奏效。

+0

感谢您的领导。如果我理解正确,这表明我需要在窗体中显式创建一个ModelChoiceField。我编辑我的代码(和这个问题)来做到这一点,但选择小部件仍然是空的。 – Sinidex 2011-04-24 01:31:12

+0

我的想法是,不是重写__init__方法,而是使用小部件= {}将所需的样式添加到您的选择中。我在想,这可能会解决您的问题与空选择部件。 – solartic 2011-04-24 01:40:37

+0

看了一下这个文档,并试图在Meta下声明widget的颜色。当我这样做时,我会得到一个无色的,填充的下拉列表。如果我将颜色规范留在上述问题中,我会看到一个彩色的,无人填充的下拉列表。 – Sinidex 2011-04-24 01:42:10