鉴于:
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
),处理数据转换的正确位置是什么?--更新澄清--
在数据库中:
+-----+---------------------------+-----+
| ... | 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>
最佳答案
您可以使用 forms.MultiValueField
和 forms.MultiWidget
。 MultiValueField
知道您的模型的一个字段包含多个离散值,而 MultiWidget
小部件知道应该如何呈现每个离散值。他们将为您的字段创建唯一名称,以便他们可以从 POST
值重建表单,并且您不必覆盖任何提供实现的表单方法,即您不必覆盖 save()
。
正如您所看到的,官方文档对这个主题有点薄。我建议您查看代码以了解所有内容是如何连接的以及何时调用什么,因为您的需求总是需要一个独特的解决方案,即:该字段将包含多少封电子邮件?正好两个,所以我可以手动指定两个 CharField
小部件,还是会在 0-2 之间,所以我必须根据传递的值动态构造所有内容?如果您需要一个好的示例作为起始引用,请查看 this SO question,其中包含一个干净且易于遵循的实现。
理想情况下,您需要将 PipedEmailAddressesField
扩展为模型字段的 CharField
,该字段知道它正在存储管道电子邮件地址。它应该能够构建自己合适的 MultiValueField
表单字段,而该表单字段又应该构建自己合适的 MultiWidget
字段。
关于django - 在 Django 中,如何使用 ModelForm 将多个表单字段作为值列表保存到单个模型字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5335603/