有没有更好的方法来创建这个Django表单?

时间:2014-05-19 00:18:27

标签: django

此特定表单有2个布尔字段,如果第一个字段为No / False,则接下来的两个字段成为必需字段。这种形式确实有效,但对我来说似乎很难看。

  1. 没有clean_approved,实际上并不需要批准,这意味着required=True参数只是文档,而不是工作代码
  2. self._errors dict代码MIGHT(不是在这种情况下)覆盖该字段中存在的任何其他错误。
  3. 使用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
    

1 个答案:

答案 0 :(得分:0)

虽然mit似乎有点过分,但您可以考虑使用内联表单。

外部表单包含“已批准”设置。 内联表单处理您的拒绝对象。

这将允许您分开两个不同的问题。第一种情况:批准是/否。第二种情况:拒绝处理

很遗憾,我现在无法为您提供示例代码,

但请查看此SO问题以初步了解此概念

Inline Form Validation in Django