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

时间:2011-01-17 22:17:46

标签: python django django-forms django-widget

在以下每种情况下,验证自定义多功能组件的输入的正确方法是什么:

  1. 如果我想实现自定义字段?
  2. 如果我想使用现有的数据库字段类型(比如DateField)?
  3. 这样做的动机来自以下两个问题:

    1. How do I use django's multi-widget
    2. Django subclassing multiwidget
    3. 我特别感兴趣的是我觉得自己被骗了。我像这样使用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 :(得分:0)

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

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

答案 1 :(得分:0)

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

因此,如果您要验证已提交的数据,则应write a validator

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

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

还有一点需要注意:如果您要实施MultiWidget,您的表单将会通过某种“压缩”形式。数据回到它呈现。文档说:

  

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

- Widgets

只需确保您正确处理该输出,您就可以了。