Ser*_*ney 23 python django django-forms extra
我必须在我的模型表单中添加额外的字段.我的方法是:
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'}),
}
Run Code Online (Sandbox Code Playgroud)
但似乎忽略了extra_fieldat的widget定义class Meta,因为我在模板上有一个裸输入标记而不是textarea.所以我申请下一个方法:
class MyForm(forms.ModelForm):
#It works fine
extra_field = forms.CharField(widget=forms.Textarea())
class Meta:
model = MyModel
Run Code Online (Sandbox Code Playgroud)
它对我来说很完美,但我曾经在class Meta声明时为表单字段指定小部件.所以我想知道:
为什么我的第一种方法不起作用?我做错了什么?
jpi*_*pic 29
如果它是一个额外的字段并不重要.这有效:
class FooForm(forms.ModelForm):
class Meta:
model = People
widgets = {
'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
}
Run Code Online (Sandbox Code Playgroud)
这不是:
class FooForm(forms.ModelForm):
name = forms.CharField()
class Meta:
model = People
widgets = {
'name': forms.Textarea(attrs={'placeholder': u'Bla bla'}),
}
Run Code Online (Sandbox Code Playgroud)
这确实没有记录,这是我在文档中可以找到的与该行为有关的最好的(也许它没有,它只是我能找到的最好的):
如果您显式实例化这样的表单字段,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)
Run Code Online (Sandbox Code Playgroud)
线路206后,田["名".小工具是确实Meta.widgets指定的textarea的.
在第219行,字段使用declared_fields更新,而字段['name'].小部件变为django.forms.widgets.TextInput,这是CharField的默认值.
显然,显式字段定义具有优先权.
感谢您的提问,很高兴知道这个问题.