假设:
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()
方法),处理数据转换的正确位置是什么? Model
或ModelForm
'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>
答案 0 :(得分:9)
您可以使用forms.MultiValueField
和forms.MultiWidget
。 MultiValueField
知道您的模型的一个字段包含多个离散值,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']
手动获取额外字段
希望这有帮助。