在Django中,如何使用ModelForm将多个表单字段保存为单个模型字段作为值列表?

时间:2011-03-17 06:22:03

标签: django django-models django-forms

假设:

from django.db import models
class MyModel(models.Model):
    ...
    owners = models.CharField(max_length=255, blank=False)

其中owners是以管道分隔的电子邮件地址列表。

在页面中,有多个<input>字段具有相同的name,因此服务器获取数组中的值。

表单的HTML代码是手动完成的,不使用内置模板(例如form.as_p)。

Django的ModelForm能处理这样的事吗?

在检索模型时(我是否必须制作自定义models.Manager?)和保存时(我会覆盖哪个save()方法),处理数据转换的正确位置是什么? ModelModelForm's)?

- 澄清更新 -

在数据库中:

+-----+---------------------------+-----+
| ... |           owners          | ... |
+-----+---------------------------+-----+
| ... | "a@a.com|b@b.com|c@c.com" | ... |
+-----+---------------------------+-----+

表格:

<form ... >
    ...
    <input type="text" name="owners" />
    <input type="text" name="owners" />
    <input type="text" name="owners" />
    ...
</form>

2 个答案:

答案 0 :(得分:9)

您可以使用forms.MultiValueFieldforms.MultiWidgetMultiValueField知道您的模型的一个字段包含多个离散值,MultiWidget窗口小部件知道应如何呈现每个离散值。他们将处理为您的字段创建唯一名称,以便他们可以从POST值重建表单,您不必覆盖任何提供实现的表单方法,即您不必重写{{1 }}

正如您所看到的,官方文档在这个主题上有点薄弱。我建议你看看代码,弄清楚一切都是有线的,什么时候被调用,因为你的要求总是需要一个独特的解决方案,即:该字段包含多少封电子邮件?正好两个,所以我可以手动指定两个save()小部件,或者它将介于0-2之间,所以我必须根据传递的值动态构造所有内容?如果您需要一个很好的示例作为起始参考,请查看this SO question,其中包含一个简洁易懂的实施方案。

理想情况下,您需要CharField扩展PipedEmailAddressesField作为模型的字段,知道它存储管道电子邮件地址。它应该能够构建自己适当的CharField表单字段,然后构建它自己适当的MultiValueField字段。

答案 1 :(得分:1)

以下是在视图中保存模型的示例: http://themorgue.org/blog/2008/05/14/django-and-modelform/ 您可以使用request.POST['fieldname']手动获取额外字段 希望这有帮助。