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

Python 为模型表单额外字段(Django)指定小部件,python,django,django-forms,extra,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

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

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_字段
的小部件定义,因为我在模板上有一个裸露的输入标记,而不是textarea。 因此,我采用下一种方法:

class MyForm(forms.ModelForm):
    #It works fine
    extra_field = forms.CharField(widget=forms.Textarea())
    class Meta:
        model = MyModel
它非常适合我,但我曾经在
classmeta
声明中为表单字段指定小部件。所以我想知道:


为什么我的第一种方法不起作用?我做错了什么?

如果它是一个额外的字段,这并不重要。这项工作:

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行之后,字段['name'].widget实际上是Meta.widgets中指定的文本区域

在第219行,使用声明的_字段和字段['name']更新字段。小部件变为django.forms.widgets.TextInput,这是CharField的默认值

显然,显式字段定义具有优先级


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

我用以下方法解决了上述问题:

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

你确定你在Django 1.4上吗?Django 1.4中引入了Form.Meta.widgets。这是否也会将字段名添加到表中?这个答案对我不适用。也许django改变了行为这应该仍然有效,也许提出另一个问题?