Django:更新模型,创建新实例而不是更新

时间:2015-05-01 11:25:25

标签: django-models model django-forms updatemodel

我正在尝试为网站上的用户制作一个简单的个人资料编辑表单。我已经按照标准的更新建议,在文档中说Django检测到实例主键并知道更新而不是插入。

唯一的问题是,当我尝试更新时,我得到一个插入。我预先填充一个带有模型实例的表单(我试图编辑的实例)但是当我尝试保存它时,我得到一个新实例。当我添加' force_update = True'行,我收到一条错误消息,告诉我没有检测到主键。不知道为什么,因为我预先用模型实例填充表单,但显然pk不是表单的一部分。有什么东西我不见了吗?

一些代码:

模特:

class profile(models.Model):
    user = models.ForeignKey(User)
    first_name = models.CharField(max_length=20, null=True)
    last_name = models.CharField(max_length=20, null=True)
    DOB = models.DateField(null=True)
    age = models.IntegerField(null=True)
    public_email = models.EmailField(null=True)
    county = models.CharField(max_length=20, null=True)
    town = models.CharField(max_length=30, null=True)

形式:

class profileForm(forms.ModelForm):
    class Meta:
        model = profile
        exclude = ['user']

观点:

@login_required()
def edit_profile(request):
    if request.POST:
        proform = profileForm(request.POST)
        if proform.is_valid():
            prof = proform.save(False)
            prof.user = request.user
            prof.save(force_update=True)

        return HttpResponseRedirect('/accounts/view_profile/')
    else:
        c = {}
        if profile.objects.filter(user=request.user).exists():
            prof = profile.objects.get(user=request.user)
            c['proform'] = profileForm(instance=prof)
        else:
            c['proform'] = profileForm()

        return render(request, 'edit_profile.html', c)

任何帮助非常感谢!

1 个答案:

答案 0 :(得分:1)

我知道了,结果我试图在表单上调用save()而不指定表单所涉及的特定实例。

代码:

@login_required()
def edit_profile(request):
    c = {}
    if profile.objects.filter(user=request.user).exists():
        profModel = profile.objects.get(user=request.user)
        c['proform'] = profileForm(instance=profModel)
    else:
        c['proform'] = profileForm()

    if request.POST:
        # this line here, added 'instance=profModel' to specify
        # the actual instance i want to save
        proform = profileForm(request.POST, instance=profModel)
        if proform.is_valid():
            prof = proform.save(False)
            prof.user = request.user
            prof.save()

        return HttpResponseRedirect('/accounts/view_profile/')
    else:

        return render(request, 'edit_profile.html', c)

作品!