【问题标题】:Django: Make certain fields in a ModelForm required=FalseDjango:使ModelForm中的某些字段需要= False
【发布时间】:2014-07-25 13:23:16
【问题描述】:

如何将 ModelForm 中的某些字段设置为 required=False?

如果我有:

class ThatForm(ModelForm):
  class Meta:
    widgets = {"text": Textarea(required=False)}

或者如果我有:

class ThatForm(ModelForm):
  text = Textarea(required=False)

Django 返回:

__init__() got an unexpected keyword argument 'required'

【问题讨论】:

  • 没有称为TextArea 的表单字段类型,您必须使用Field 的祖先,可能是称为CharField 并添加一个TextArea 小部件
  • 是否可以在不定义静态字段和/或小部件类型的情况下将该字段设置为 required=False?

标签: django forms field required modelform


【解决方案1】:

来自 cmets。可能是的:

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

【讨论】:

【解决方案2】:

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

The documentation says

如果模型字段有空白=True,则在表单字段上将 required 设置为 False。否则,required=True。

另见documentation for blank 本身。

【讨论】:

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

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

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',
        )

【讨论】:

  • 一切都像魅力一样。 @SandeepBalagopal 你能解释一下到底出了什么问题并显示错误吗?
  • 试过了,这些字段不是必需的。如果您查看模型表单中的选项,模型表单没有这样的选项github.com/django/django/blob/master/django/forms/…
  • @SandeepBalagopal,你想告诉人们在这里投票stackoverflow.com/a/24045492/5992385 和这里stackoverflow.com/a/1429646/5992385 是错误的
  • 我没有注意到您已覆盖的 init 方法。有用。很抱歉混淆了。
  • @isilanes 你很难过“我相信 ModelForm 中的所有字段都是默认必需的”。但不是所有的。 ModelForm 是否需要 Weather 字段取决于其 Model 上的字段参数。有时我们需要通过将非必填字段设为必填来覆盖此类行为。
【解决方案4】:

以下可能是合适的

class ThatForm(ModelForm):
    text = forms.CharField(required=False, widget=forms.Textarea)

【讨论】:

    【解决方案5】:

    你可以试试这个:

    class ThatForm(ModelForm):
      class Meta:
        requireds = 
        {
           'text':False,
        }
    

    必需项必须在 Meta 下。

    【讨论】:

    • 你真的用过这个吗?因为我在 Django 文档或源代码中没有看到任何迹象表明这会起作用。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多