python - 有没有办法对 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表单可以做到这一点吗?
解决方案
就在这里。Django文档实际上向您展示了如何做到这一点:
- 使用三个单独的字段
- 使它们都不是必需的 (
required=False
) - 在表单中添加一个
clean()
方法,在其中一起验证三个字段。如果您第一次调用super().clean()
,您可以确定这些字段首先已单独验证,例如 的输入IntegerField
实际上是一个整数,因此您不再需要这样做。 - 使用
cleaned_data
字典查看每个字段的值。您还可以检查self.errors[<field>]
是否有任何字段填写不正确。 - 提高 a
ValidationError
是您对输入不满意。 - 在您的模板中,不要忘记
{{ form.non_field_errors }}
在表单顶部显示 ,以便用户知道您提出的错误。或者只是在特定字段之一上添加错误以将其显示在该字段附近。
推荐阅读
- .net-core - CascadingParameter 和 ChildContent 的不同行为在 Blazor 中创建缩进的子组件
- excel - 将文件从excel列表复制到其他文件夹
- java - 在下载签名小程序之前执行哪些控制?
- excel - Excel 宏另存为 PDF
- javascript - 为什么我们不能在 Electron 中打开链接?
- orientdb - 使用 pyorient 在 OrientDB 中存储二进制文件
- html - 旋转列表项
- python - 将文件名列表与包含在 python 中的 azure 存储帐户中的文件名列表的文件进行比较
- css - Bootstrap中多行等高面板
- javascript - 拖放 2 个框