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

2024-03-07

Given:

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

where owners是一个用竖线分隔的电子邮件地址列表。

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

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

姜戈可以吗ModelForm处理这样的事情吗?

在检索模型时,处理数据转换的正确位置是什么(我是否必须自定义models.Manager?)以及保存时(哪个save()我要重写方法吗?这Model的或ModelForm's)?

--更新澄清--

在数据库中:

+-----+---------------------------+-----+
| ... |           owners          | ... |
+-----+---------------------------+-----+
| ... | "[email protected] /cdn-cgi/l/email-protection|[email protected] /cdn-cgi/l/email-protection|[email protected] /cdn-cgi/l/email-protection" | ... |
+-----+---------------------------+-----+

表格:

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

您可以使用forms.MultiValueField http://docs.djangoproject.com/en/1.4/ref/forms/fields/#multivaluefield and forms.MultiWidget http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.MultiWidget. MultiValueField知道您的模型的一个字段包含多个离散值并且MultiWidget小部件知道每个离散值应该如何呈现。他们将为您的字段创建唯一的名称,以便他们可以根据POST值,您不必重写任何提供实现的表单方法,即您不必重写save().

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

理想情况下,您会想要一个PipedEmailAddressesField延伸CharField作为模型的字段,它知道它正在存储管道电子邮件地址。它应该能够构建自己合适的MultiValueField表单字段应该反过来构造它自己合适的MultiWidget field.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐