指定窗口小部件的模型形式的额外字段(Django的)(Specifying widget for m

2019-06-27 07:26发布

我有额外的字段添加到我的模型形式。 我的做法是:

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_fieldclass Meta被忽略,因为我有一个裸露的输入标签,而不是在模板文本区域 。 所以我申请下一个方法:

class MyForm(forms.ModelForm):
    #It works fine
    extra_field = forms.CharField(widget=forms.Textarea())
    class Meta:
        model = MyModel

它完美的我,但我用来指定在表单字段部件class Meta声明。 所以我想知道:

为什么我的第一种方法行不通? 我做错了吗?

Answer 1:

如果它是一个额外的字段没关系。 这工作:

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 /表格/ 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后,田[“名”。小工具的确 Meta.widgets指定的textarea的。

在管线219,字段与declared_fields更新,并且字段[“名称”]。插件变得django.forms.widgets.TextInput其是用于CharField默认值。

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

谢谢你的邀请,好知道,好问题。



Answer 2:

我解决了上面下面的情况:

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


文章来源: Specifying widget for model form extra field (Django)