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

Python 有条件地只需要Django模型表单中的一个字段,python,django,forms,validation,model,Python,Django,Forms,Validation,Model,是否根据是否填写了同一表单中的其他字段,有条件地要求填写一个字段 If field1 has no data, but field2 does form is valid. 不寻找任何javascript解决方案。我觉得应该用django表单来解决这个问题,但不太确定如何最好地解决它。重写.clean(self)方法,检查self.cleaned_数据并引发ValidationError 如果知道验证将应用于此类的所有对象,也可以使用模型执行此操作。要在表单级别使用下面的数据,请使用

是否根据是否填写了同一表单中的其他字段,有条件地要求填写一个字段

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

不寻找任何javascript解决方案。我觉得应该用django表单来解决这个问题,但不太确定如何最好地解决它。

重写.clean(self)方法,检查self.cleaned_数据并引发ValidationError


如果知道验证将应用于此类的所有对象,也可以使用模型执行此操作。要在表单级别使用下面的数据,请使用已清理的\u数据。下面是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()
参考文献:

以下是一个表单示例:

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

参考:

对于条件必填字段,最好的解决方案是重写表单的clean方法,并根据条件弹出错误。例如:

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

注意:如果对Django CMS插件执行此操作,请确保覆盖插件的models.py定义中的clean(self)方法,而不是forms.py中的方法。
clean(self):
    if self.cleaned_data.get(some_field) == 1:
        self.errors.pop(other_field, None)