2011-04-23 184 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