1

如果不创建新条目,如果条目已经存在,我正在尝试更新数据库。

def saveprofile(request):
    location = request.POST['location']
    email = request.POST['email']
    if request.user.is_authenticated():
        userprofile = UserProfiles(user=request.user)
        if userprofile:
           userprofile.location=location
           userprofile.email=email
           userprofile.save()
           return render_to_response('profile.html',{'pfields':userprofile})
        else:
           userprofile = UserProfiles(user=request.user, location=location, email=email)
           userprofile.save()
           return render_to_response('profile.html',{'pfields':userprofile})

它在扔

(1062,“密钥‘user_id’的重复条目‘15’”)

4

3 回答 3

3

您可以使用get_or_create更简单的方法。

于 2014-03-31T01:46:45.593 回答
2

您必须使用getDjango 来获取现有对象,而不是创建新对象,这就是您调用UserProfiles(user=request.user)当前正在执行的操作。

例如:

try:
    userprofile = UserProfiles.objects.get(user=request.user)
except DoesNotExist:
    # create object here.

有关更多信息,请参阅此链接

于 2012-04-26T16:55:40.530 回答
0

首先,虽然您确实可以通过这种方式手动处理表单,但使用 Django 处理表单的“正确方法”是使用django.forms. 话虽如此……</p>

我假设您的UserProfiles模型不包含显式主键。这意味着,Django 会自动创建自己的字段,称为id.

现在,当您使用构造函数创建模型的新实例时,该id字段将保持为空。它不会从数据库中获取任何东西,它会创建一个新对象。之后,您为其字段分配一些值。请注意,以下两个是等价的:

userprofile = UserProfiles(user=request.user, location=location, email=email)

# and
userprofile = UserProfiles(user=request.user)
userprofile.location=location
userprofile.email=email

因为在这两种情况下,您只需创建一个新对象并设置 和的user值。locationemail

一旦您尝试保存此对象,就会收到错误消息。

正确的做法是首先从数据库中获取对象:

try:
    profile = UserProfiles.objects.get(user=request.user)
except DoesNotExist:
    # Handle the case where a new object is needed.
else:
    # Handle the case where you need to update an existing object.

有关更多信息,请查看https://docs.djangoproject.com/en/dev/topics/db/queries/

于 2012-04-26T16:58:57.377 回答