首页 > 解决方案 > 有没有办法对 Django 表单强制执行“其中一个输入,但并非所有输入都是必需的”?

问题描述

我正在编写一个函数来更新 Django 中三个可能的字段之一——布尔值、字符串或整数。

我试图这样:

class AccountsForm(forms.Form): 
    update_key = forms.CharField(required=True)
    update_value  = forms.ComboField(fields=[forms.CharField(),
         forms.IntegerField(), forms.BooleanField()], 
         required=True)

但这不是我正在寻找的功能,因为它需要 CharField+IntegerField+BooleanField 的组合。我需要恰好出现在表单中的三个字段之一。django表单可以做到这一点吗?

标签: pythondjangodjango-forms

解决方案


就在这里。Django文档实际上向您展示了如何做到这一点:

  • 使用三个单独的字段
  • 使它们都不是必需的 ( required=False)
  • 在表单中添加一个clean()方法,在其中一起验证三个字段。如果您第一次调用super().clean(),您可以确定这些字段首先已单独验证,例如 的输入IntegerField实际上是一个整数,因此您不再需要这样做。
  • 使用cleaned_data字典查看每个字段的值。您还可以检查self.errors[<field>]是否有任何字段填写不正确。
  • 提高 aValidationError是您对输入不满意。
  • 在您的模板中,不要忘记{{ form.non_field_errors }}在表单顶部显示 ,以便用户知道您提出的错误。或者只是在特定字段之一上添加错误以将其显示在该字段附近。

推荐阅读