1

在每种情况下,验证自定义 multiwidget 输入的正确方法是什么:

  1. 如果我想实现一个自定义字段?
  2. 如果我想使用现有的数据库字段类型(比如 DateField)?

这样做的动机来自以下两个问题:

  1. 如何使用 django 的 multi-widget
  2. Django子类化multiwidget

我特别感兴趣的是我觉得自己被骗了。我这样用过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()检查中失败。

因此,我的第三个问题是我应该以其他方式这样做吗?对于这种情况,我不想要自定义字段。

谢谢。

4

2 回答 2

0

您可以像任何其他字段一样验证表单字段,在表单中实现 clean_fieldname 方法。如果您的验证逻辑分布在许多表单字段中(这与许多小部件相同!)您将其放在表单的 clean() 方法中。

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

于 2011-01-18T08:02:59.320 回答
0

根据文档,验证是小部件背后字段的责任,而不是小部件本身。小部件除了为用户呈现输入并将输入数据传回字段外,什么都不做。

因此,如果您想验证已提交的数据,您应该编写一个验证器

这对于 MultiWidgets 尤其重要,因为您可以排除多个方面的数据错误。每个方面都需要返回给用户以供考虑,这样做的内置方法是编写验证器并将它们放置在该字段的验证器属性中。

与文档相反,您不必按表格执行此操作。相反,您可以扩展其中一个内置表单并将条目添加到default_validators.

还有一点需要注意:如果您要实现一个 MultiWidget,您的表单将把某种“压缩”数据传回给它进行渲染。文档说:

此方法从字段中获取单个“压缩”值并返回“解压缩”值列表。可以假定输入值有效,但不一定非空。

-小部件

只要确保您正确处理该输出,您就会没事的。

于 2018-03-14T19:46:32.987 回答