在Django模型表单中有条件地只需一个字段

15 投票
3 回答
14603 浏览
提问于 2025-04-15 18:34

有没有办法让一个字段根据同一表单中另一个字段是否填写来决定是否必填?

If field1 has no data, but field2 does
    form is valid.

If field1 has no data and field2 has no data
    form is invalid

我不想用任何JavaScript的解决方案。我觉得这个问题应该用Django表单来解决,但我不太确定该怎么做。

3 个回答

0

对于那些根据条件是否需要填写的字段,最好的解决办法是重写表单的清理方法,并在特定条件下显示错误信息。举个例子:

clean(self):
    if self.cleaned_data.get(some_field) == 1:
        self.errors.pop(other_field, None)
15

如果你知道验证规则适用于这个类的所有对象,你也可以使用模型来实现这个功能。要在表单层面使用下面的内容,可以使用 cleaned_data。这里有一个直接来自 Django 文档的示例,使用了 ValidationError

class Article(models.Model):

    status = models.CharField(max_length=75, blank=False, null=False)
    pub_date = models.CharField(max_length=75, blank=False, null=False)

    def clean(self):
        # Don't allow draft entries to have a pub_date.
        if self.status == 'draft' and self.pub_date is not None:
            raise ValidationError('Draft entries may not have a publication date.')
        # Set the pub_date for published items if it hasn't been set already.
        if self.status == 'published' and self.pub_date is None:
            self.pub_date = datetime.date.today()

参考资料:模型实例清理Django 验证器

这里是一个表单的示例:

class SimpleForm(forms.ModelForm):

    def clean(self):
        cleaned_data = super(SimpleForm, self).clean()  # Get the cleaned data from default clean, returns cleaned_data
        field1 = cleaned_data.get("field1")
        field2 = cleaned_data.get("field2"),

        if not field1 and not field2:
            raise forms.ValidationError('Please fill in both fields.')

        return cleaned_data

参考资料:表单和字段验证

11

重写 .clean(self) 方法,检查 self.cleaned_data 并抛出 ValidationError(验证错误)。

https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

撰写回答