2013-06-06 5 views
11

J'ai un modèle d'utilisateur personnalisé comme ci-dessous:modèle utilisateur Django personnalisé dans admin, relation "auth_user" n'existe pas

class User(AbstractUser): 
    subscribe_newsletters = models.BooleanField(default=True) 
    old_id = models.IntegerField(null=True, blank=True) 
    old_source = models.CharField(max_length=25, null=True, blank=True) 

Et en utilisant la UserAdmin builtin

admin.site.register(User, UserAdmin) 

Lors de l'édition l'enregistrement d'utilisateur fonctionne très bien, mais quand j'ajouter un utilisateur, je reçois l'erreur suivante

Exception Value: 
relation "auth_user" does not exist 
LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user... 

Répondre

27

Après quelques recherches autour de ce que j'ai trouvé

https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

Le coupable est une fonction à l'intérieur clean_usernameUserCreationForm intérieur django.contrib.auth.forms.py. Quelques billets ont été créés, mais apparemment les mainteneurs ne pense pas que c'est un défaut:

https://code.djangoproject.com/ticket/20188

https://code.djangoproject.com/ticket/20086

def clean_username(self): 
     # Since User.username is unique, this check is redundant, 
     # but it sets a nicer error message than the ORM. See #13147. 
     username = self.cleaned_data["username"] 
     try: 
      User._default_manager.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(self.error_messages['duplicate_username']) 

Le User dans ce fichier est directement référence au modèle de l'utilisateur builtin.

Pour résoudre ce problème, je crée ma forme personnalisée

from models import User #you can use get_user_model 
from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth import forms 

class MyUserCreationForm(UserCreationForm): 
    def clean_username(self): 
     # Since User.username is unique, this check is redundant, 
     # but it sets a nicer error message than the ORM. See #13147. 
     username = self.cleaned_data["username"] 
     try: 
      User._default_manager.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(self.error_messages['duplicate_username']) 

    class Meta(UserCreationForm.Meta): 
     model = User 

class MyUserAdmin(UserAdmin): 
    add_form = MyUserCreationForm 

admin.site.register(User,MyUserAdmin) 

Ou vous pouvez essayer patcher le singe UserCreationForm d'origine pour remplacer la variable User.

+1

Belle prise. Cela devrait certainement être pris en compte étant donné que les docs Django vous encouragent à utiliser ces classes dès la sortie de la boîte lorsque vous étendez le modèle User. – dustinfarris

+1

Juste la solution que je cherche. – Charlesliam

+1

Il a sauvé ma journée! – neelix

4

Ceci est dû à la migration n'est pas exécutée. Ce problème est résolu pour moi en exécutant la commande suivante:

python manage.py syncdb

3

Django 1.8

Si votre application n'est pas encore à l'aide des migrations, cela pourrait aussi être le problème, comme contrib.auth les utilise. L'activation des migrations pour mon application a résolu le problème pour moi.

$ ./manage.py makemigrations <my_app> 
$ ./manage.py migrate 
+0

Vous avez sauvé ma santé mentale. Apparemment, si vous effacez les migrations, vous devez conserver le dossier de migration et '__init__.py', sinon Django échouera à créer la migration initiale et échouera par la suite 'migrate'. –

Questions connexes