我正在尝试从我的一个表单中编写一个干净的方法Django 1.5
.用户可以从预先存在的对象列表中进行选择,也可以自己插入一个对象,但是他必须执行这两项操作中的一项(如果他同时执行这两项操作,ModelChoiceField
则在相对视图中具有优先权).
这是有罪的形式:
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
(所以问题基本相同).
我真的很疯狂试图解开原因.
您应该使用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