Django:使ModelForm中的某些字段成为必需= False

Syn*_*ead 28 forms django field modelform required

如何在ModelForm中创建某些字段= False?

如果我有:

class ThatForm(ModelForm):
  class Meta:
    widgets = {"text": Textarea(required=False)}
Run Code Online (Sandbox Code Playgroud)

或者,如果我有:

class ThatForm(ModelForm):
  text = Textarea(required=False)
Run Code Online (Sandbox Code Playgroud)

Django回归:

__init__() got an unexpected keyword argument 'required'
Run Code Online (Sandbox Code Playgroud)

yed*_*tko 44

以下是评论.可能是:

class ThatForm(ModelForm):
    def __init__(self, *args, **kwargs):
        # first call parent's constructor
        super(ThatForm, self).__init__(*args, **kwargs)
        # there's a `fields` property now
        self.fields['desired_field_name'].required = False
Run Code Online (Sandbox Code Playgroud)


rio*_*ted 28

你应该将blank = True添加到相应的模型中

文件说

如果模型字段为空= True,则表单字段上的required设置为False.否则,required = True.

另请参阅文档以了解空白.

  • 不,此解决方案是特殊解决方案,这是一种非常常见的情况,您有一个带有一些必填字段的模型,例如街道、城市、国家/地区的地址都是强制性的,但您想使用表单 (ModelForm) 搜索其中的一部分字段,例如仅城市和国家。我是这样理解 OP 的。您的解决方案对我来说非常明显,您将模型字段定义为 blank=True(有时与 null=True 结合使用)仅在特殊情况下有效。一般的答案是 yedpodtrzitko 的答案。 (3认同)
  • 这应该是公认的答案,因为它是“空白”的用途 (2认同)
  • 这并不总是解决方案:想象一下,您在模型中有一个强制的字段,但是您想要搜索具有或不具有此限制的该类型的对象.然后,您希望表单允许不带该属性的搜索.例如,您将颜色作为模型中的必填字段,但您可能希望搜索具有特定形状的对象,而不管颜色如何. (2认同)
  • 没有解决方案*永远是解决方案*。但我提出的解决方案是应该使用的最佳实践,除非您的情况不寻常(就像您提到的那样)。在这种情况下,一个单独的 SO 问题就有意义了。但OP没有提到任何这种情况,问题很笼统,所以应该是答案。 (2认同)

Val*_*sik 9

当我们需要在一堆字段上设置所需选项时,我们可以:

class ThatForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for field in self.Meta.required:
            self.fields[field].required = True

    class Meta:
        model = User
        fields = (
            'email',
            'first_name',
            'last_name',
            'address',
            'postcode',
            'city',
            'state',
            'country',
            'company',
            'tax_id',
            'website',
            'service_notifications',
        )
        required = (
            'email',
            'first_name',
            'last_name',
            'address',
            'postcode',
            'city',
            'country',
        )
Run Code Online (Sandbox Code Playgroud)

  • 我没有注意到您已重写了init方法。有用。对不起,混淆了。 (4认同)
  • @isilans 你很伤心“我相信默认情况下 ModelForm 中的所有字段都是必填的”。但不是所有的。ModelForm 上是否需要天气字段取决于其模型上的字段参数。有时我们需要通过将非必填字段设置为必填字段来覆盖此类行为。 (2认同)

qui*_*uin 5

以下可能是合适的

class ThatForm(ModelForm):
    text = forms.CharField(required=False, widget=forms.Textarea)
Run Code Online (Sandbox Code Playgroud)