此特定表单有2个布尔字段,如果第一个字段为No / False,则接下来的两个字段成为必需字段。这种形式确实有效,但对我来说似乎很难看。
clean_approved
,实际上并不需要批准,这意味着required=True
参数只是文档,而不是工作代码使用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
答案 0 :(得分:0)
虽然mit似乎有点过分,但您可以考虑使用内联表单。
外部表单包含“已批准”设置。 内联表单处理您的拒绝对象。
这将允许您分开两个不同的问题。第一种情况:批准是/否。第二种情况:拒绝处理
很遗憾,我现在无法为您提供示例代码,
但请查看此SO问题以初步了解此概念