【问题标题】:Is there a better way to create this Django form?有没有更好的方法来创建这个 Django 表单?
【发布时间】:2014-07-06 20:18:32
【问题描述】:

这个特定的表单有 2 个布尔字段,如果第一个字段是 No/False,那么接下来的两个字段是必需的。这种形式确实有效,但对我来说似乎很丑陋。

  1. 没有clean_approved,实际上不需要批准,这意味着required=True 参数只是文档,而不是工作代码
  2. 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


【解决方案1】:

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

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

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

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

但是请看一下这个 SO Question 来初步了解这个概念

Inline Form Validation in Django

【讨论】:

  • 嗯,这将在管理员中工作,但我不确定这比我目前拥有的更干净。我认为在管理员之外不支持内联,你有表单集,但我看不出这会使这段代码更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多