将多个表单字段值保存到数据库表(模型)中

时间:2013-07-23 11:29:07

标签: django forms many-to-many models

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

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的模型,该模型具有many to many的{​​{1}}链接

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

  3. 当表单提交了值时,在视图中我从中获取值 request.POST并尝试保存到ModelForm模型。

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

  4. 所以任何人都可以让我知道如何将College字段保存到数据库表中我是指具有manytomany字段的模型

    提前致谢.....

2 个答案:

答案 0 :(得分:0)

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

您可以使用

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

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

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

答案 1 :(得分:0)

在调用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