gpt4 book ai didi

python - 为模型表单额外字段指定小部件(Django)

转载 作者:IT老高 更新时间:2023-10-28 20:27:52 24 4
gpt4 key购买 nike

我必须在我的模型表单中添加额外的字段。我的做法是:

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 的小部件定义被忽略了,因为我有一个裸 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'}),
}

这是not documented indeed ,这是我在可能与该行为相关的文档中找到的最好的(也许不是,这只是我能找到的最好的):

If you explicitly instantiate a form field like this, Django assumes that you want to completely define its behavior [...] you must set the relevant arguments explicitly when declaring the form field.

此行为的实现在 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'].widget 确实是 Meta.widgets 中指定的 Textarea。

在第 219 行,fields 更新为 declared_fields,fields['name'].widget 变为 django.forms.widgets.TextInput,这是 CharField 的默认值。

显然,明确的字段定义具有优先权。

感谢您的提问,很高兴知道,很好的问题。

关于python - 为模型表单额外字段指定小部件(Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com