用户注册会导致IntegrityError

时间:2012-05-01 03:33:55

标签: python django

用户注册后,将显示以下IntegrityError:

IntegrityError at /users/signup
(1062, "Duplicate entry '1' for key 2")

即使用户收到错误,他也可以定期登录。创建用户以及UserProfile。

以下是导致错误的/ users / signup视图:

def signup(request):
  signup_form = SignupForm(request.POST)
  #goal = request.POST.get('goal')
  goal = None
  if signup_form.is_valid():
    username = signup_form.cleaned_data['username']
    email = signup_form.cleaned_data['email']
    password = signup_form.cleaned_data['password']
    user = User.objects.create_user(username, email, password)
    user = authenticate(username=username, password=password)
    login(request, user)
    return HttpResponseRedirect("/")
  else:
    return render_to_response("authorize.html", {'signup_form': signup_form, 'goal': goal}, context_instance=RequestContext(request))

这是我的/user/models.py:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from main.models import Goal

class UserProfile(models.Model):
  user = models.OneToOneField(User)
  joined_goals = models.ManyToManyField(Goal, related_name="joined_goals")
  followingGoals = models.ManyToManyField(Goal, related_name="following_goals")

  def __unicode__(self):
    return self.user.username

  def get_goals(self):
    try:
      goals = Goal.objects.filter(user=self.user)
      return goals
    except Goal.DoesNotExist:
      return []

def create_user_profile(sender, instance, created, **kwargs):
  if created:
    userProfile = UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

我已多次删除MySQL数据库中的所有表并运行python manage.py syncdb,但在创建新用户后,我每次都会收到相同的错误。

编辑:我的本地主机上没有出现此错误,仅在我的远程主机上。我在我的localhost上使用sqlite,在远程主机上使用mysql。

1 个答案:

答案 0 :(得分:1)

我要猜测一下,并建议你可以多次注册你的post_save信号,因为models.py被加载了不止一次。您没有以安全的方式注册信号。也许它试图在save()上不止一次快速创建配置文件并获得错误。

查看Preventing Duplicate Signals

上的文档

尝试将最后一行更改为:

post_save.connect(create_user_profile, sender=User, 
                    dispatch_uid="user_create_profile")

拥有调度uid将导致它只被注册一次,即使它被导入多次被调用。