如何将 django 表单输入转换为 python 数据?
Posted
技术标签:
【中文标题】如何将 django 表单输入转换为 python 数据?【英文标题】:How do I convert a django form input to python data? 【发布时间】:2011-06-10 16:56:29 【问题描述】:我有一个允许用户为模型字段输入数据的小部件。表单中的数据不能直接转换为 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
是要走的路。它有一个从输入名称到其值的字典。
【问题讨论】:
我已经在你的other question 中告诉过你——实现to_python
。
是我自己还是标题和问题问的是两个完全不同的问题?
@AndiDog 也许我误解了一些东西。 (OP 更新。)抱歉,问题有点重复。
如果你在to_python
中得到 value == None,你可能忘记绑定表单(例如form = MyForm(request.POST)
)。我刚试过,to_python
从我的 POST 参数中获取值。必须是您的代码中的某些内容。
【参考方案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()
类型的验证失败,这正是我想要发生的。
您的小部件是否希望以这种方式发生取决于您在做什么。我不相信它是最优雅的解决方案,所以我要提出自己的问题......
参考:
How do I use Django's MultiWidget? Django subclassing multiwidget - reconstructing date on post using custom multiwidget【讨论】:
【参考方案2】:Form 子类中的clean
和clean_<field>
方法对此负责。以下是有关验证(和清理)的文档:http://docs.djangoproject.com/en/1.2/ref/forms/validation/
【讨论】:
以上是关于如何将 django 表单输入转换为 python 数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 django forms.py 选择项转换为 html 中的列表?