Django ModelForm不保存添加到request.POST或通过form.save(commit = False)的数据

时间:2016-09-27 06:58:03

标签: python django django-forms

我有django表单提交到显示它的视图,并希望在保存之前添加一些数据,但它似乎无法正常工作。

models.py

from django.contrib.auth.models import User
from django.db import models

class Profile(models.Model):
    user = models.OneToOneField(User)
    display_name = models.CharField(max_length=145, blank=True, null=True)
    bio = models.CharField(max_length=1000, blank=True, null=True)

class Module(models.Model):
    name = models.CharField(max_length=45)
    semester = models.CharField(max_length=40)
    prof = models.ForeignKey('Profile', null=True, blank=True)

forms.py

class ModuleForm(ModelForm):
    class Meta:
        model = Module
        fields = ['name',  'semester']

views.py

我已尝试将prof添加到request.POST,然后再将其传递给moduleform,但它会保存从 HTML 提交的所有其他数据,prof除外

prof = Profile.objects.get(user=request.user)
if request.method == 'POST':
    mtb = request.POST._mutable
    request.POST._mutable = True
    request.POST['prof'] = str(prof.id)
    request.POST._mutable = mtb
    moduleform = ModuleForm(request.POST)
    moduleform.save()

我也尝试使用commit=False进行保存,但prof仍未添加。

moduleform.save(commit=False)
moduleform.prof = prof
moduleform.save()

1 个答案:

答案 0 :(得分:1)

请参阅django's official documentation中的此示例:

form = PartialAuthorForm(request.POST)
author = form.save(commit=False)
author.title = 'Mr'
author.save()

在你的情况下(未经测试):

if request.method == 'POST':
    form = ModuleForm(request.POST)
    object = form.save(commit=False)
    object.prof = Profile.objects.get(user=request.user)
    object.save()

修改 澄清你对我的回答的评论:

moduleform.save(commit=False)
moduleform.prof = prof
moduleform.save()

不起作用,因为表单永远不会在实例上保存prof,因为它不是fields的一部分。这就是您必须在模型级别设置prof的原因。