我正在尝试从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
(因此问题基本相同)。
我真的疯了,试图解开原因。
答案 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