モデルフォームにフィールドを追加する必要があります。私のアプローチは次のとおりです。
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'}),
}
しかし、extra_field
のclass Meta
のウィジェット定義は無視されているようです。これは、テンプレートにtextareaではなく裸のinputタグがあるためです。だから私は次のアプローチを適用します:
class MyForm(forms.ModelForm):
#It works fine
extra_field = forms.CharField(widget=forms.Textarea())
class Meta:
model = MyModel
私にとっては完璧に機能しますが、以前はclass Meta
宣言でフォームフィールドのウィジェットを指定していました。だから私は疑問に思う:
なぜ私の最初のアプローチが機能しないのですか?私が間違っていることは何ですか?
それが余分なフィールドであるかどうかは関係ありません。これは機能します:
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'}),
}
これは 実際には文書化されていません 、これはその動作に関連する可能性のあるドキュメントで見つけることができる最高のものです(おそらくそうではないかもしれませんが、私が見つけることができる最高のものです):
このようなフォームフィールドを明示的にインスタンス化する場合、Djangoは、その動作を完全に定義することを前提としています[.. 。]フォームフィールドを宣言するときは、関連する引数を明示的に設定する必要があります。
この動作の実装は、Django/forms /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行目以降、fields ['name']。widgetisは、実際にMeta.widgetsで指定されたTextareaです。
219行目で、fieldsはdeclared_fieldsで更新され、fields ['name']。widgetはCharFieldのデフォルトであるDjango.forms.widgets.TextInputになります。
どうやら、明示的なフィールド定義が優先されます。
質問してくれてありがとう、知っておくといい、素晴らしい質問。
私は上記の状況を次のように解決しました:
class FooForm(forms.ModelForm):
name = forms.CharField(widget=TextArea(attrs={'placeholder': u'Bla bla'}))
class Meta:
model = People