2012-08-23 64 views
20

我必須在模型表單中添加額外的字段。我的做法是:爲模型表單額外字段(Django)指定小部件

class MyForm(forms.ModelForm): 
    extra_field = forms.CharField() 
    class Meta: 
     model = MyModel 
     widgets = { 
      #Does not work 
      'extra_field': forms.Textarea(attrs={'placeholder': u'Bla bla'}), 
     } 

但似乎在class Metaextra_field是小部件的定義將被忽略,因爲我有一個裸輸入標籤,而不是textarea的上的模板。 所以我申請下一個方法:

class MyForm(forms.ModelForm): 
    #It works fine 
    extra_field = forms.CharField(widget=forms.Textarea()) 
    class Meta: 
     model = MyModel 

它可以完美的我,但我用在class Meta聲明指定表單域的小部件。所以我想知道:

爲什麼我的第一種方法不起作用?我做錯了什麼?

+0

你確定你是在Django的1.4? Form.Meta.widgets是在Django 1.4中引入的。 – jpic

+0

是的。 'Django版本:\t 1.4' –

回答

23

它是否是一個額外的領域並不重要。這工作:

class FooForm(forms.ModelForm): 
    class Meta: 
     model = People 
     widgets = { 
      'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}), 
     } 

這不:

class FooForm(forms.ModelForm): 
    name = forms.CharField() 

    class Meta: 
     model = People 
     widgets = { 
      'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}), 
     } 

這是not documented indeed,這是我能找到的文檔最好的,可能涉及到的行爲(也許它沒有,它只是盡我所能找到):

如果顯式實例這樣的表單字段,Django的假定你想完全定義其行爲 [...] 當聲明表單域時,您必須明確設置相關參數。

這種行爲的實施是在Django /表格/ models.py線219:

204   if opts.model: 
    205    # If a model is defined, extract form fields from it. 
    206    fields = fields_for_model(opts.model, opts.fields, 
    207          opts.exclude, opts.widgets, formfield_callback) 
    208    # make sure opts.fields doesn't specify an invalid field 
    209    none_model_fields = [k for k, v in fields.iteritems() if not v] 
    210    missing_fields = set(none_model_fields) - \ 
EE 211        set(declared_fields.keys()) 
    212    if missing_fields: 
    213     message = 'Unknown field(s) (%s) specified for %s' 
    214     message = message % (', '.join(missing_fields), 
    215          opts.model.__name__) 
    216     raise FieldError(message) 
    217    # Override default model fields with any custom declared ones 
    218    # (plus, include all the other declared fields). 
    219    fields.update(declared_fields) 

後線206,場[ '名' 小窗口確實在指定的textarea的Meta.widgets。

在第219行,字段用declared_fields更新,fields ['name']。widget變成django.forms.widgets.TextInput,它是CharField的默認值。

顯然,明確的字段定義具有優先權。

感謝提問,很高興知道,很好的問題。

+0

感謝您的明確答案。 –

+0

這個答案對我不起作用。也許Django改變了行爲 –

+0

這仍然應該工作,也許提出另一個問題? – jpic

2

我解決了上面下面的情況:

class FooForm(forms.ModelForm): 
    name = forms.CharField(widget=TextArea(attrs={'placeholder': u'Bla bla'})) 
    class Meta: 
     model = People 
+0

這是否也將字段名稱添加到表中? – tilaprimera

相關問題