如何在 django 中将一个表单字段拆分为模型的多个字段?

Posted

技术标签:

【中文标题】如何在 django 中将一个表单字段拆分为模型的多个字段?【英文标题】:How to split one form fields into multiple fields of a model in django? 【发布时间】:2019-12-08 20:19:30 【问题描述】:

这个问题类似于

Using multiple input fields for one model's attribute with django

How to render two form fields as one field in Django forms?

我需要的基本上与MultiValueField 相反,我可以将一个表单字段中的数据 - Name 保存到两个模型字段 - Firstname, Lastname。我找不到任何与 MultiValueField 相反的东西。

有人可以建议我什么是更好的方法吗?

【问题讨论】:

【参考方案1】:

你为什么不在Form中定义name字段并重写save方法来保存到模型字段,像这样:

class SomeForm(forms.ModelForm):
    name = forms.CharField(max_length=255, required=True)

    class Meta:
        model = YourModel
        fields = ['name', 'and_other_fields']

    def save(self, commit=True)
        instance = super(SomeForm, self).save(commit=False)
        _name = self.cleaned_data.get('first_name').split(' ')
        instance.first_name = _name[0]
        instance.last_name = ' '.join(_name[1:])
        instance.save()
        return instance

【讨论】:

意图是在表单上有一个Name字段,输入的数据应该在模型中拆分并保存为FirstnameLastname。模型中没有Name字段 对不起,我误解了这个问题。但想法是一样的。我已经更新了我的答案【参考方案2】:

假设,用户将键入用空格分隔的名字和姓氏。你可以用这个:

u_name = YourModelName()

name = request.POST['name'].split(" ") # give attribute name in html and use that name here
first_name = name[0]
last_name = name[1]

u_name.first_name = first_name
u_name.last_name = last_name

u_name.save()

您可以使用任何方法来保存您的数据。只需使用拆分。

【讨论】:

你真的不应该直接使用request.POST。您应该将它们传递给 Forms 或 ModelForms 以完成所有值的验证和转换。然后,您可以使用 form.cleaned_data 访问这些值。

以上是关于如何在 django 中将一个表单字段拆分为模型的多个字段?的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中将 css 类添加到验证错误的字段

如何在 Django 管理员中为模型字段使用自定义表单字段?

Django Crispy 表单根据需要设置模型字段

在 Django 的 DetailView 中将表单字段设置为对象 ID

基于model的form表单

Django:如何在手动表单字段中显示模型的外键对象作为选择