【问题标题】:saving many to many form field values in to database table(model)将多对多的表单字段值保存到数据库表(模型)中
【发布时间】:2013-07-22 10:45:41
【问题描述】:

我有一个模型,我将其转换为如下形式

models.py

class Book(models.Model):
    name = models.CharField()
    description = models.TextField()

class College(models.Model):
    name = models.CharField()
    books = models.ManyToManyField(Book)
    place = models.CharField()

form.py

from django.forms import ModelForm
from myapp.models import College

class CollegeForm(ModelForm):

    class Meta:
        model = College

views.py

def college_view(request):
    form = CollegeForm()
    if request.method == 'POST':
        form = CollegeForm(request.POST):
        if form.is_valid():
            college_obj = College.objects.create(name=request.POST['name'],
                                                place=request.POST['place'],
                                                books= ???????)
        return HttpResponseRedirect(reverse('index'))
    return render_to_response('college-detail.html', {'form':form})

所以我上面所做的就是

  1. 创建了一个名为 College 的模型,该模型具有指向 Book 的 many to many 链接

  2. 使用ModelForm将模型转换为表单并呈现为html

  3. 当表单使用值提交时,鉴于我正在从
    获取该值 request.POST 并尝试保存到 College 模型中。

    但是你可以观察到大学表格有一个many to many 字段和两个CharField, 所以我已将 char 字段直接保存到表中,但我被困在保存 表中的多对多字段books(即模型College)

所以任何人都可以简单地告诉我如何将manytomany 字段保存到数据库表中,我的意思是具有manytomany 字段的模型

提前致谢.....

【问题讨论】:

  • 如果您使用的是 ModelForm,为什么要直接创建模型? ModelForms 有一个 .save() 方法,我假设他们会做你所期望的,但没有尝试过(我一般远离 ModelForms,太多隐含的行为不符合我的口味)。
  • 我正在创建模型,因为我需要输入的信息用于某些目的,因此需要保存它们。

标签: django forms many-to-many models


【解决方案1】:

在调用form.is_valid() 之后,调用form.save() 也会为您保存多对多数据。如果您想在保存之前更改/添加数据以形成对象,您可以这样做

f = form.save(commit=False)

在使用commit=False 调用 save 后,django 在表单对象上提供了一个save_m2m() 方法。注意 form 而不是 f。处理完 f 对象后,您可以继续调用save_m2m() 来保存该表单的多对多数据。

form.save_m2m() 

参考:https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#the-save-method

【讨论】:

    【解决方案2】:

    因此,如果您阅读ModelForms 上的文档,您会注意到它们配备了save() 方法,该方法已经提供了您想要的功能。

    你可以使用

    if form.is_valid():
         form.save()
    

    或者,如果你想为模型添加更多的值,你可以

    if form.is_valid():
         instance = form.save(commit=False)
         instance.custom_field = custom_value
         instance.save()
    

    【讨论】:

    • 是的,但是在这里我想将数据保存到其他 mdoel 中,但不是表格,对吗?正如您在上面的代码中看到的问号,那么需要做什么才能将 many2many 字段值(如 [1,2,3])保存到书籍中?
    • 对不起,我没有关注。根据文档,save() 方法保存或创建(commit=False)与表单关联的新模型。它不会保存表单本身。
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多