我有一个小部件,允许用户输入模型字段的数据。表单中的数据不能直接转换为Python - 它需要一些强制。我在哪里放这个代码?小部件是否负责将其post
数据转换为python值?该领域本身?
我认为也许value_from_datadict()
可能是正确的,但现在它看起来有不同的用途。
(我在管理界面中使用该表单,如果它有任何区别。)
更新 @AndiDog:我不相信to_python
就是我想要的。来自Django来源:
135 def to_python(self, value):
136 """
137 Converts the input value into the expected Python data type, raising
138 django.core.exceptions.ValidationError if the data can't be converted.
139 Returns the converted value. Subclasses should override this.
140 """
141 return value
您是说这是通过value
作为表单中的POST
数据来调用的?我提交了一份打印声明,提交表单时value
为None
,即使输入有数据。
更新2 :实际上,看起来value_from_datadict
是可行的方法。它有一个从输入名称到其值的字典。
答案 0 :(得分:1)
Form子类中的clean
和clean_<field>
方法对此负责。以下是有关验证(和清洁)的文档:http://docs.djangoproject.com/en/1.2/ref/forms/validation/
答案 1 :(得分:1)
引用value_from_datadict()
的django来源:
给定数据字典和此窗口小部件的名称,返回值 这个小部件。如果没有提供,则返回None。
实际上并不清楚这个功能的用途。其目的是根据发布数据的整个字典返回该窗口小部件的值;也就是说,它通过该数据查看,给出一个小部件的实例,该小部件的数据属于它并返回该数据。
我通过使用经过仔细处理的raise
例外版本来破坏我自己的自定义窗口小部件来检查这一点。
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in is_valid
121. return self.is_bound and not bool(self.errors)
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in _get_errors
112. self.full_clean()
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
267. self._clean_fields()
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in _clean_fields
278. value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
你想在这里验证吗?我确实使用了一个multiwidget子类,但这不一定是最好的方法。我的方法从字典重新构造日期,尝试从中创建一个python日期对象。如果成功,则将其转换为字符串并返回有效的字符串;如果没有,则返回None,这在DateField()
类型的数据库中验证失败,这就是我想要发生的事情。
您的小部件是否希望以这种方式发生取决于您正在做什么。我不相信它是最优雅的解决方案,所以我打算提出自己的问题......
参考文献: