Django modelform不是必填字段

And*_*res 60 django django-models django-forms optional

我有一个这样的表格:

class My_Form(ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')
Run Code Online (Sandbox Code Playgroud)

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

mad*_*han 81

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
Run Code Online (Sandbox Code Playgroud)

  • 尽管akshar的答案看起来更好,但这种方法可以防止你必须设置东西来设置help_text和label之类的东西. (3认同)
  • 此方法在处理模型级别定义为FK的字段时特别有用.通过akshar的方法,必须设置`queryset`属性. (3认同)

Aks*_*aaj 77

猜猜你的模型是这样的:

class My_Class(models.Model):

    address = models.CharField()
Run Code Online (Sandbox Code Playgroud)

你的表格:

class My_Form(ModelForm):

    address = forms.CharField(required=False)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')
Run Code Online (Sandbox Code Playgroud)

  • 使用ModelChoiceField.所以,如果字段定义是`abc = models.ForeignKey(Abc)`,你可以写`abc = forms.ModelChoiceField(queryset = Abc.objects.all(),required = False)` (12认同)
  • 外国关键领域呢? (3认同)
  • 如果您之前没有使用过,请确保已导入表单:`from django import forms` (2认同)
  • 您确定 Django > 1.8 应该接受 `blank=True` 吗?文档另有说明,我的代码不喜欢它,他们说我应该使用“required=False”。你的星座是不是颠倒了? (2认同)

Atm*_*tma 6

你必须添加:

address = forms.CharField(required=False)
Run Code Online (Sandbox Code Playgroud)

  • blank和null属性不用于ModelForms (4认同)
  • 这应该在_model_字段中,而不是表单字段.`null = True,blank = True`将导致ModelForm字段为'required = False` (2认同)

Fil*_*vic 5

@Anentropic对@Atma 答案的评论中的解决方案对我有用。我认为这也是最好的。

他的评论:

null=True, blank=True将导致ModelFormrequired=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)
Run Code Online (Sandbox Code Playgroud)

我还认为这是最漂亮的解决方案,因为你做同样的事情, putnullblankto True,只要你有一个简单的char字段或者像我一样的ManyToMany字段。


Die*_*ães 5

field = models.CharField(max_length=9, default='', blank=True)
Run Code Online (Sandbox Code Playgroud)

只需在模型字段中添加blank = True,当您使用模型形式时就不需要。

  • 我总是向下滚动到目前为止以获得这样的答案。 (3认同)

小智 5

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

my_field = models.PositiveIntegerField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

解释:

如果你使用 null=True

`my_field = models.PositiveIntegerField(null=True)`
Run Code Online (Sandbox Code Playgroud)

那么 my_field 是必需的,在表单中用 * 反对它,你不能提交空值。

如果你使用 blank=True

`my_field = models.PositiveIntegerField(blank=True)`
Run Code Online (Sandbox Code Playgroud)

那么 my_field 不是必需的,在表单中没有 * 反对它,你不能提交值。但是会得到不允许的空字段。

笔记:

1) marking as not required and 
2) allowing null field are two different things.
Run Code Online (Sandbox Code Playgroud)

专家提示:

Read the error more carefully than documentation.
Run Code Online (Sandbox Code Playgroud)