Django自定义(多)小部件输入验证

1 投票
2 回答
3151 浏览
提问于 2025-04-16 10:08

在这些情况下,验证自定义多组件输入的正确方法是什么呢:

  1. 如果我想实现一个自定义字段,该怎么做?
  2. 如果我想使用现有的数据库字段类型(比如日期字段),该怎么做?

我之所以会有这些疑问,是因为我看到下面两个问题:

  1. 如何使用 Django 的多组件?
  2. 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 个回答

0

根据文档,验证数据的责任在于小部件背后的字段,而不是小部件本身。小部件的作用就是展示用户输入的内容,并把输入的数据传回给字段。

所以,如果你想验证提交的数据,你需要编写一个验证器

这对于多小部件(MultiWidgets)来说尤其重要,因为数据可能有多个方面出错。每个方面都需要返回给用户考虑,而实现这个的标准方法就是编写验证器,并把它们放在字段的验证器属性中。

与文档相反,你不需要为每个表单都这样做。你可以扩展一个内置的表单,并在default_validators中添加一个条目。

还有一点要注意:如果你要实现一个多小部件,你的表单会传回某种“压缩”的数据以供渲染。文档中提到:

这个方法从字段中获取一个“压缩”的值,并返回一个“解压缩”的值列表。输入值可以被认为是有效的,但不一定是非空的。

-小部件

只要确保你正确处理这些输出,就没问题。

0

你可以像处理其他字段一样来验证你的表单字段,只需要在你的表单中实现一个叫做 clean_fieldname 的方法。如果你的验证逻辑涉及到很多表单字段(这和有很多小部件是不一样的!),那么你就可以把这些逻辑放在表单的 clean() 方法里。

http://docs.djangoproject.com/en/1.2/ref/forms/validation/

撰写回答