【问题标题】:Django modelform NOT required fieldDjango modelform 非必填字段
【发布时间】:2013-04-18 19:48:59
【问题描述】:

我有这样的表格:

class My_Form(ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

如何将地址字段设为可选?

【问题讨论】:

  • 模型是什么样子的?

标签: django django-forms optional django-models


【解决方案1】:
class My_Form(forms.ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

    def __init__(self, *args, **kwargs):
        super(My_Form, self).__init__(*args, **kwargs)
        self.fields['address'].required = False

【讨论】:

  • 虽然 akshar 的答案看起来更好,但这种方法可以防止您必须做一些事情来设置诸如 help_text 和 label 之类的东西。
  • 此方法在处理在模型级别定义为 FK 的字段时特别有用。通过 akshar 的方法,必须设置 queryset 属性。
【解决方案2】:

猜猜你的模型是这样的:

class My_Class(models.Model):

    address = models.CharField()

您的 Django 版本

class My_Form(ModelForm):

    address = forms.CharField(required=False)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

您的 Django 版本 > 1.8 表单:

class My_Form(ModelForm):

    address = forms.CharField(blank=True)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

【讨论】:

  • 外键字段呢?
  • 使用 ModelChoiceField。所以,如果字段定义是abc=models.ForeignKey(Abc),你可以写abc = forms.ModelChoiceField(queryset=Abc.objects.all(), required=False)
  • 如果您之前没有使用过表单,请确保已导入表单:from django import forms
  • 你确定 Django > 1.8 应该接受blank=True 吗?文档另有说明,我的代码不喜欢它,他们说我应该使用required=False。你把你的标志倒过来了吗?
【解决方案3】:
field = models.CharField(max_length=9, default='', blank=True)

只需在你的模型字段中添加blank=True,当你使用modelforms时就不需要了。

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

来源: https://docs.djangoproject.com/en/3.1/topics/forms/modelforms/#field-types

【讨论】:

  • 需要注意的是,如果你像MyForm(form_data).is_valid()一样手动提交表单,那么form_data中一定不能引用该字段。如果包含,但发送到空白或 None 值,它似乎仍然可以触发验证错误。
【解决方案4】:

您必须添加:

address = forms.CharField(required=False)

【讨论】:

  • ModelForms不使用blank和null属性
  • 这应该在 model 字段中,而不是在表单字段中。 null=True, blank=True 将导致 ModelForm 字段为 required=False
【解决方案5】:

解决方案:同时使用blank=Truenull=True

my_field = models.PositiveIntegerField(blank=True, null=True)

解释:

如果你使用null=True

my_field = models.PositiveIntegerField(null=True)

那么my_field是必填项,在表单中*旁边是不能提交空值的。

如果你使用blank=True

my_field = models.PositiveIntegerField(blank=True)

那么my_field就不是必须的了,表单中不会有*在旁边,你也不能提交值。但它会得到不允许的空字段。

注意:标记为不需要和允许空字段是两个不同的东西。

专业提示:比文档更仔细地阅读错误。

【讨论】:

  • 此答案适用于不是 CharField 或 TextField 的字段。对于这些,您不希望既为空又为空,因为空有多种表示形式。
【解决方案6】:

@Anentropic's solution 来自@Atma's answer 的评论为我工作。而且我认为它也是最好的。

他的评论:

null=True, blank=True 将导致ModelForm 字段为required=False

我刚刚将它设置在我的 UserProfile 类的 ManyToMany 字段中,它完美地工作。

我的UserProfile 类现在看起来像这样(注意friends 字段):

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    friends = models.ManyToManyField('self', null=True, blank=True)

我也认为这是最漂亮的解决方案,因为你做同样的事情,把nullblank 放到True,天气你有一个简单的char 字段,或者像我一样,@987654334 @字段。

【讨论】:

  • 对于ManyToManyFieldblank=True 就足够了。
【解决方案7】:

以上答案都是正确的;不过请注意,在 ManyToManyField 上设置 null=True 在数据库级别没有影响,并且在迁移时会引发以下警告:

(fields.W340) null has no effect on ManyToManyField.

在另一个thread 中解释了一个很好的答案。

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2018-12-24
    • 1970-01-01
    • 2019-04-04
    • 2018-07-25
    相关资源
    最近更新 更多