Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django自定义(多)小部件输入验证_Python_Django_Django Forms_Django Widget - Fatal编程技术网

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

Python Django自定义(多)小部件输入验证,python,django,django-forms,django-widget,Python,Django,Django Forms,Django Widget,在以下每种情况下,验证自定义多窗口小部件输入的正确方法是什么: 如果我想实现一个自定义字段 如果我想使用现有的数据库字段类型(比如DateField) 其动机来自以下两个问题: ? 我特别感兴趣的是,我觉得自己作弊了。我使用了来自_datadict()的value\u,如下所示: def value_from_datadict(self, data, files, name): datelist = [widget.value_from_datadict(data, files, n

在以下每种情况下,验证自定义多窗口小部件输入的正确方法是什么:

  • 如果我想实现一个自定义字段
  • 如果我想使用现有的数据库字段类型(比如DateField)
  • 其动机来自以下两个问题:

  • ?
  • 我特别感兴趣的是,我觉得自己作弊了。我使用了来自_datadict()的
    value\u,如下所示:

    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\u valid()
    检查中失败

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


    谢谢。

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


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

    因此,如果您想验证已提交的数据,您应该

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

    与文档相反,您不必按照表单执行此操作。相反,您可以扩展其中一个内置表单,并向
    default\u验证器添加一个条目

    还有一个注意事项:如果您要实现一个多窗口小部件,那么您的表单将向它传递某种“压缩”数据以进行渲染。文件说:

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

    -


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

    如果验证对表单实例是唯一的,那么这是有意义的。然而,如果它是一个总是需要某种形式的验证的自定义小部件,那么手动将其添加到小部件使用的每个表单中是不合逻辑的,并且违反了DRY。