2013-06-06 18 views
11

Ho un modello personalizzato utente come di seguito:Django personalizzato in Admin, relazione "auth_user" non esiste

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) 

E utilizzando l'UserAdmin integrato

admin.site.register(User, UserAdmin) 

Durante la modifica del record utente funziona bene, ma quando aggiungo un utente, ottengo il seguente errore

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

risposta

27

Dopo alcuni scavi ho trovato questo

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

Il colpevole è una funzione clean_username all'interno UserCreationForm all'interno django.contrib.auth.forms.py. Alcuni biglietti sono stati creati, ma a quanto pare i manutentori non pensare che sia un difetto:

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']) 

Il User in questo file è direttamente riferimento a al modello utente incorporato.

Per risolvere il problema, ho creato il mio personalizzato forma

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) 

o si può provare scimmia patching l'originale UserCreationForm per sostituire la variabile User.

+1

Bella cattura. Questo dovrebbe essere sicuramente risolto considerando che i documenti Django ti incoraggiano a usare queste classi fin da subito quando estendi il modello User. – dustinfarris

+1

Solo la soluzione che sto cercando. – Charlesliam

+1

Mi ha salvato la giornata! – neelix

4

Ciò è dovuto alla migrazione non viene eseguita. Questo problema è stato risolto per me eseguendo il comando seguente:

pitone manage.py syncdb

3

Django 1.8

Se l'applicazione non è ancora utilizzando le migrazioni allora questo potrebbe anche essere il problema, come contrib.auth li usa L'abilitazione delle migrazioni per la mia app l'ha risolto per me.

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

Hai salvato il mio equilibrio mentale. Apparentemente se cancelli le migrazioni, devi mantenere la cartella di migrazione e '__init__.py' in esso, altrimenti Django non riuscirà a creare la migrazione iniziale, e successivamente non riuscirà a "migrare". –

Problemi correlati