我正在尝试为网站上的用户制作一个简单的个人资料编辑表单。我已经按照标准的更新建议,在文档中说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)
任何帮助非常感谢!
答案 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)
作品!