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

标签 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 ),处理数据转换的正确位置是什么?

--更新澄清--

在数据库中:
+-----+---------------------------+-----+
| ... |           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/

相关文章:

Django Admin基于另一个字段过滤ForeignKey下拉列表

django - 如何在 django 中通过 POST 接收 XML 文件

python - 多对多的嵌套序列化器

python - Django queryset 对象返回 None 而不是 0,即使数据库将 0 存储为字段值

python - Django 管理命令并将自定义参数发送到 post_save 信号

python - Django IntegrityError-NOT NULL 约束失败 : portfolio_myportfolio.holder_id

django-ajax-选择应用程序 : How do I create a new object when there isn't already one in the database?

python - 使用 django-import-export 流式传输响应

django - 如何隐藏SECRET_KEY?

django - 内联模型表单是否发出 post_save 信号? (django)