如何将django表单输入转换为python数据?

时间:2011-01-17 20:51:13

标签: python django forms

我有一个小部件,允许用户输入模型字段的数据。表单中的数据不能直接转换为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数据来调用的?我提交了一份打印声明,提交表单时valueNone,即使输入有数据。

更新2 :实际上,看起来value_from_datadict是可行的方法。它有一个从输入名称到其值的字典。

2 个答案:

答案 0 :(得分:1)

Form子类中的cleanclean_<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()类型的数据库中验证失败,这就是我想要发生的事情。

您的小部件是否希望以这种方式发生取决于您正在做什么。我不相信它是最优雅的解决方案,所以我打算提出自己的问题......

参考文献: