【发布时间】:2014-07-06 20:18:32
【问题描述】:
这个特定的表单有 2 个布尔字段,如果第一个字段是 No/False,那么接下来的两个字段是必需的。这种形式确实有效,但对我来说似乎很丑陋。
- 没有
clean_approved,实际上不需要批准,这意味着required=True参数只是文档,而不是工作代码 - self._errors dict 代码可能(在这种情况下不是)覆盖该字段中存在的任何其他错误。
使用 Django 使编写漂亮代码变得容易的所有其他方式,我必须为这个布尔字段(应该是必需的)和基于第一个字段的答案的可选必需字段做错了。
请告诉我正确的方法。
class JobApprovalForm(forms.Form):
approved = forms.NullBooleanField(required=True)
can_reapply = forms.NullBooleanField(required=False)
reject_reason = forms.CharField(required=False, widget=forms.Textarea())
def clean_approved(self):
""" Without this, approved isn't really required! """
if self.cleaned_data['approved'] == None:
raise forms.ValidationError(_("This field is required."))
return self.cleaned_data['approved']
def clean(self):
""" Make the other two fields required if approved == False """
if not self._errors and self.cleaned_data['approved'] == False:
required_msg = [_("If this job is not approved, this field is required")]
if self.cleaned_data['can_reapply'] == None:
self._errors['can_reapply'] = self.error_class(required_msg)
if not self.cleaned_data['reject_reason']:
self._errors['reject_reason'] = self.error_class(required_msg)
return self.cleaned_data
【问题讨论】:
-
几周前我问了一个关于声明性库的问题。我认为答案是,现在这是 Django 中的一个整体,甚至没有被第三方库插入。
标签: django