为模型表单额外字段指定小部件(Django) [英] Specifying widget for model form extra field (Django)
问题描述
我必须在我的模型表单中添加额外的字段.我的方法是:
I have to add extra field to my model form. My approach is:
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 Meta
处的 extra_field
小部件定义,因为我有一个裸 input 标签而不是 模板上的 textarea.所以我应用了下一个方法:
But it seems that widget definition for extra_field
at class Meta
is ignored, because i have a bare input tag instead of textarea on a template.
So I apply next approach:
class MyForm(forms.ModelForm):
#It works fine
extra_field = forms.CharField(widget=forms.Textarea())
class Meta:
model = MyModel
它非常适合我,但我曾经在 class Meta
声明中为表单字段指定小部件.所以我想知道:
It works perfectly for me, but I used to specify widgets for form fields at class Meta
declaration. So I wonder:
为什么我的第一种方法不起作用?我做错了什么?
Why my first approach doesn't work? What I am doing wrong?
推荐答案
如果是额外的字段也没关系.这有效:
It doesn't matter if it's an extra field. This works:
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'}),
}
这是确实没有记录,这是我在可能与该行为相关的文档中找到的最好的(也许不是,这只是我能找到的最好的):
This is not documented indeed, that's the best I could find in the docs that could relate to that behaviour (maybe it doesn't, it's just the best i could find):
如果你像这样显式实例化一个表单域,Django 假设你想完全定义它的行为 [...] 你必须在声明表单域时显式设置相关参数.
此行为的实现在 django/forms/models.py 第 219 行:
The implementation of this behaviour is in django/forms/models.py line 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'].widget是确实是 Meta.widgets 中指定的 Textarea.
After line 206, fields['name'].widget is indeed the Textarea specified in Meta.widgets.
在第 219 行,fields 更新为声明的字段,fields['name'].widget 变成 django.forms.widgets.TextInput,这是 CharField 的默认值.
At line 219, fields is updated with declared_fields, and fields['name'].widget becomes django.forms.widgets.TextInput which is the default for CharField.
显然,明确的字段定义具有优先权.
Apparently, explicit field definitions have priority.
感谢提问,很高兴知道,好问题.
Thanks for asking, good to know, great question.
这篇关于为模型表单额外字段指定小部件(Django)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!