Django表单没有得到clean方法的值

时间:2014-01-04 18:45:52

标签: django django-forms

我正在尝试从Django 1.5中的一个表单中编写一个干净的方法。 用户可以从预先存在的对象列表中进行选择或单独插入一个对象,但是他必须执行这两项操作中的一项(如果他同时执行ModelChoiceField在相对视图中具有优先权)。 / p>

这是有罪的形式:

class UploadFileForm(forms.Form):
    subject = forms.ModelChoiceField(queryset=Subject.objects.all(), required=False, label='What subject this file is about?')
    subject1 = forms.CharField(required=False, label="Or insert your subject if you didn't find it in the menu")

    def clean_subject(self):
        subject = self.cleaned_data.get('subject')
        subject1 = self.cleaned_data.get('subject1')
        if not subject and not subject1:
            raise forms.ValidationError('This field is required.')

whitch与这个模型有关:

class Subject(models.Model):
    subject = models.CharField(max_length = 30, primary_key=True, blank=False, null=False)

问题是:如果用户让ModelChoiceField为空,并尝试在CharField中插入一个值,那么表格无论如何都会引发错误(当然也不应该)。

我也尝试过:subject1 = self.cleaned_data.get('subject1', None)但在这种情况下,subject1值始终为None(因此问题基本相同)。

我真的疯了,试图解开原因。

1 个答案:

答案 0 :(得分:9)

您应该使用clean方法而不是clean_<fieldname>来验证彼此依赖的字段(Django clean() docs)。

class UploadFileForm(form.Form):
    subject = forms.ModelChoiceField(queryset=Subject.objects.all(), required=False)
    subject1 = forms.CharField(required=False)

    def clean(self):
        subject = self.cleaned_data.get('subject')
        subject1 = self.cleaned_data.get('subject1')
        if not subject and not subject1:
            raise forms.ValidationError('Subject field is required.')
        return self.cleaned_data