2010-07-09 23 views
2

J'ai modifié mon application, de sorte que lorsqu'un nouvel utilisateur est enregistré, son nom d'utilisateur et son adresse e-mail sont les mêmes. Mais quand un nouvel utilisateur est créé, je reçois IntegrityError: (1062, "Dupliquer l'entrée '[email protected]' pour la clé 'nom d'utilisateur'"), toujours l'utilisateur est créé correctement.
Fonction register_new dans lequel un nouvel utilisateur est créé ('temp_data' est un dict de form.cleaned_data):IntegrityError lors de la sauvegarde de l'utilisateur avec le nom d'utilisateur = email

def register_new(request): 
    data = request.session['temp_data'] 
    email = data['email'] 
    password1 = data['password1'] 
    userdata = {'email': email, 'password1': password1} 
    backend = request.session['backend'] 
    user = backend.register(request, userdata) 

, voici la fonction de registre de registration.backend, qui crée un nouvel utilisateur:

def register(self, request, userdata): 
    logging.debug("backend.register") 
    logging.debug(userdata) 
    username, email, password = userdata['email'], userdata['email'], userdata['password1'] 
    if Site._meta.installed: 
     site = Site.objects.get_current() 
    else: 
     site = RequestSite(request)   
    new_user = RegistrationProfile.objects.create_inactive_user(username, email, password, site) 
    return new_user 

Traceback:

File "/home/rails/site-packages/django/core/handlers/base.py" in get_response 
    92.     response = callback(request, *callback_args, **callback_kwargs) 
File "/home/rails//registration/views.py" in register_new 
    112.  user = backend.register(request, userdata) 
File "/home/rails/registration/backends/default/__init__.py" in register 
    21.                  password, site) 
File "/home/rails/site-packages/django/db/transaction.py" in _commit_on_success 
    240.     res = func(*args, **kw) 
File "/home/rails/registration/models.py" in create_inactive_user 
    73.   new_user = User.objects.create_user(username, email, password) 
File "/home/rails/site-packages/django/contrib/auth/models.py" in create_user 
    105.   user.save() 
File "/home/rails/site-packages/django/db/models/base.py" in save 
    410.   self.save_base(force_insert=force_insert, force_update=force_update) 
File "/home/rails/site-packages/django/db/models/base.py" in save_base 
    495.      result = manager._insert(values, return_id=update_pk) 
File "/home/rails/site-packages/django/db/models/manager.py" in _insert 
    177.   return insert_query(self.model, values, **kwargs) 
File "/home/rails/site-packages/django/db/models/query.py" in insert_query 
    1087.  return query.execute_sql(return_id) 
File "/home/rails/site-packages/django/db/models/sql/subqueries.py" in execute_sql 
    320.   cursor = super(InsertQuery, self).execute_sql(None) 
File "/home/rails/site-packages/django/db/models/sql/query.py" in execute_sql 
    2369.   cursor.execute(sql, params) 
File "/home/rails/site-packages/django/db/backends/util.py" in execute 
    19.    return self.cursor.execute(sql, params) 
File "/home/rails/site-packages/django/db/backends/mysql/base.py" in execute 
    84.    return self.cursor.execute(query, args) 
File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py" in execute 
    173.    self.errorhandler(self, exc, value) 
File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py" in defaulterrorhandler 
    36.  raise errorclass, errorvalue 

Exception Type: IntegrityError at /register_new/ 
Exception Value: (1062, "Duplicate entry '[email protected]' for key 'username'") 

J'ai googlé des solutions et a trouvé de nombreuses tables, y compris la suppression/de synchronisation, attrapant l'IntegrityError à différents endroits, en changeant les champs de décodage pour les colonnes de la table (j'ai essayé de mettre à utf8_bin mais pas de résultats). Comment régler ce problème ?

Tableau structure:

http://i27.tinypic.com/dotmjs.png
http://i32.tinypic.com/1zq79tj.png

J'ai trouvé ce billet à django docs: http://code.djangoproject.com/ticket/3083 Mais il devrait y avoir 2 modèles créés en même temps. Dans mon cas, rien comme cela se produit, je suppose:/

MISE À JOUR Modèle:

class User(models.Model): 
    username = models.CharField(_('Email'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer.")) 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    email = models.EmailField(_('e-mail address'), blank=True) 
    password = models.CharField(_('password'), max_length=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>.")) 
    is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site.")) 
    is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts.")) 
    is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_("Designates that this user has all permissions without explicitly assigning them.")) 
    last_login = models.DateTimeField(_('last login'), default=datetime.datetime.now) 
    date_joined = models.DateTimeField(_('date joined'), default=datetime.datetime.now) 
+0

Pouvez-vous montrer la struct table ure? –

+0

Le champ "nom d'utilisateur" est unique, vous ne pouvez pas avoir exactement les mêmes noms d'utilisateur dans la table. –

+0

mais de nombreux projets, y compris django-lfs utilisent une méthode similaire (création d'utilisateur avec nom d'utilisateur = email, email = email) et cela fonctionne. Plus tôt, cela fonctionnait dans mon projet, mais après 700 commits il n'y a aucun moyen de trouver la source du problème:/ – muntu

Répondre

0

Je surprends erreur MySQLdb dans ce fichier init de back-end d'enregistrement, car il est le premier à des problèmes:

importation mysqldb

(...) 
    new_user = None 
    try:  
     new_user = RegistrationProfile.objects.create_inactive_user(username, email, password, site) 
    except MySQLdb.IntegrityError: 
     pass 
+0

Pourquoi ignoreriez-vous l'erreur. Que se passe-t-il si son véritable problème d'ID utilisateur en double? – Mutant