Django自定义(多)小部件输入验证
在这些情况下,验证自定义多组件输入的正确方法是什么呢:
- 如果我想实现一个自定义字段,该怎么做?
- 如果我想使用现有的数据库字段类型(比如日期字段),该怎么做?
我之所以会有这些疑问,是因为我看到下面两个问题:
我特别想提的是,我觉得自己有点作弊。我使用了 value_from_datadict()
,像这样:
def value_from_datadict(self, data, files, name):
datelist = [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
try:
D = date(day=int(datelist[0]), month=int(datelist[1]), year=int(datelist[2]))
return str(D)
except ValueError:
return None
这个方法会查看 POST
字典,并为我的组件构建一个值(具体可以参考上面提到的问题)。但是,同时我也加了一些验证;也就是说,如果创建 D
作为日期对象失败,我就返回 None
,这样在 is_valid()
检查时就会失败。
所以我的第三个问题是,我是否应该用其他方法来处理这个?在这种情况下,我并不想要一个自定义字段。
谢谢。
2 个回答
根据文档,验证数据的责任在于小部件背后的字段,而不是小部件本身。小部件的作用就是展示用户输入的内容,并把输入的数据传回给字段。
所以,如果你想验证提交的数据,你需要编写一个验证器。
这对于多小部件(MultiWidgets)来说尤其重要,因为数据可能有多个方面出错。每个方面都需要返回给用户考虑,而实现这个的标准方法就是编写验证器,并把它们放在字段的验证器属性中。
与文档相反,你不需要为每个表单都这样做。你可以扩展一个内置的表单,并在default_validators
中添加一个条目。
还有一点要注意:如果你要实现一个多小部件,你的表单会传回某种“压缩”的数据以供渲染。文档中提到:
这个方法从字段中获取一个“压缩”的值,并返回一个“解压缩”的值列表。输入值可以被认为是有效的,但不一定是非空的。
-小部件
只要确保你正确处理这些输出,就没问题。
你可以像处理其他字段一样来验证你的表单字段,只需要在你的表单中实现一个叫做 clean_fieldname 的方法。如果你的验证逻辑涉及到很多表单字段(这和有很多小部件是不一样的!),那么你就可以把这些逻辑放在表单的 clean() 方法里。