0

ユーザーがサインアップすると、次の 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 を実行しましたが、新しいユーザーを作成した後も毎回同じエラーが発生します。

編集:このエラーはローカルホストでは発生せず、リモートホストでのみ発生します。ローカル ホストで sqlite を使用し、リモート ホストで mysql を使用しています。

4

1 に答える 1

1

私は推測して、models.py が複数回ロードされた結果、post_save シグナルが複数回登録されている可能性があることを示唆します。安全な方法でシグナルを登録していません。おそらく、save() でプロファイルを複数回すばやく作成しようとすると、エラーが発生します。

重複信号の防止に関するドキュメントをご覧ください

最後の行を次のように変更してみてください。

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

ディスパッチ uid があると、インポートの結果として何度も呼び出されたとしても、一度だけ登録されます。

于 2012-05-02T04:42:34.303 に答える