【问题标题】:In Django, how do you save multiple form fields into a single model field as a list of values using a ModelForm?在 Django 中,如何使用 ModelForm 将多个表单字段作为值列表保存到单个模型字段中?
【发布时间】:2011-07-17 04:13:03
【问题描述】:

给定:

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 的ModelForms 可以处理这样的事情吗?

在检索模型时(我是否必须制作自定义 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>

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

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

    如您所见,官方文档在该主题上有点薄。我建议您看一下代码,以了解所有内容是如何连接的以及何时调用什么,因为您的要求总是需要一个独特的解决方案,即:该字段将包含多少封电子邮件?正好两个,所以我可以手动指定两个CharField 小部件,还是介于 0-2 之间,所以我必须根据传递的值动态构造所有内容?如果您需要一个好的示例作为起始参考,请查看this SO question,其中包含一个干净且易于遵循的实现。

    理想情况下,您需要一个扩展 CharFieldPipedEmailAddressesField 作为模型的字段,它知道它正在存储管道电子邮件地址。它应该能够构造它自己的适当的MultiValueField 表单字段,该字段应该反过来构造它自己的适当的MultiWidget 字段。

    【讨论】:

    • 感谢您的详尽回答!你说的方式,我有点相信这是正确的答案。将在接下来的几天内尝试进行确认。 :)
    • 如果您不介意的话,您对我应该如何动态构建适当数量的字段有什么建议吗,比如我是否没有限制(或一个非常大的限制)?
    • 我做了部分解决方案。我创建了一个 PipedEmailField,它拆分了一个管道分隔的字符串并对每个令牌运行验证。没有打扰小部件。在我的前端,我只有一个隐藏的输入字段,在提交表单之前,我使用 JavaScript 从多个文本字段的值中转储了一个管道分隔的字符串。无论如何我都会接受这个答案,因为事实证明它仍然非常有帮助。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2019-12-07
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多