8

Sto cercando di utilizzare AbstractUser per aggiungere un campo al modello utente standard di Django. Questo è il mio codice:Errore del database: nessuna tabella: auth_user. Estensione di AbstractUser e utilizzo del modello per la registrazione su admin

class GUser(AbstractUser): 
    uuid = UUIDField(auto=True) 

Questo ha avuto successo perché dalla shell che posso dire,

>>> a = GUser.objects.all() 

>>> a 
[<GUser: User1>] 

>>> a[0].uuid 
UUID('7d1f0b7b52144a2ea20db81ce74741e3') 

Il problema che sto avendo è la registrazione di un nuovo utente dal/admin. Quando creo un nuovo utente ottengo un errore di database:

no such table: auth_user 

Prima di entrare più in esso, ecco la mia forms.py:

class GUserChangeForm(UserChangeForm): 
    class Meta: 
     model = get_user_model() 

class GUserCreationForm(UserCreationForm): 

    class Meta: 
     model = get_user_model() 

    def clean_username(self): 
      username = self.cleaned_data["username"] 
      try: 
       get_user_model().objects.get(username=username) 
      except get_user_model().DoesNotExist: 
       return username 
      raise forms.ValidationError(self.error_messages['duplicate']) 

E il mio admin.py:

class GUserAdmin(UserAdmin): 
    form = GUserChangeForm 
    add_form = GUserCreationForm 
    fieldsets = (
     (None, {'fields': [('username', 'password')]}), 
     ('Personal info', {'fields': ('is_active','is_staff','is_superuser','groups', 'user_permissions')}), 
     ('Important dates', {'fields': ('last_login', 'date_joined')}), 
     #('Universal ID', {'fields': ('uuid')}) 
     ) 

admin.site.register(GUser,GUserAdmin) 

ho letto che quando questo è successo ad altre persone hanno implementato le loro proprie forme (come ho fatto io) per sovrascrivere clean_username (self):

Tuttavia non penso che questo venga chiamato quando tento di aggiungere un utente dall'admin. Il file auth.forms.py viene chiamato anche se registro il mio GUserAdmin.

Inoltre, quando cancello il mio database (sqlite3) e poi chiamo python manage.py syncdb, vedo che una tabella auth_user non viene effettivamente creata.

Sì, ho incluso AUTH_USER_MODEL in settings.py.

Qualsiasi aiuto sarebbe molto apprezzato.

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

insieme a tonnellate di SO posti, ma nessuno di loro sembra per risolvere il problema che sto avendo.

+1

Sembra che questo thread abbia la tua risposta: https://groups.google.com/forum/#! topic/django-users/kOVEy9zYn5c Apparentemente, il modello personalizzato non onora il 'Meta' per il manager – karthikr

+0

@karthikr Avevo visto quella pagina ma non ero sicuro se stessimo avendo lo stesso esatto problema. La soluzione per cambiare effettivamente il codice in auth.forms.py? – FrancescoA

+0

Penso che sia la risposta di Scott Anderson il 20 marzo – karthikr

risposta

0

Così cancellato tutto il lavoro che avevo fatto con questo e spostato con l'utente standard in modo che potessi fare progressi. Poi un giorno sono tornato a farlo e sono riuscito a farlo funzionare in un'ora. Pubblicherò il codice come riferimento, ma non riesco davvero a capire cosa abbia fatto la differenza. So che le forme di creazione e le cose non erano necessarie.

models.py

class PropaUser(AbstractUser): 
    uuid = UUIDField(auto=True) 

admin.py

from django.contrib import admin 
from login.models import PropaUser 

admin.site.register(PropaUser) 

settings.py

AUTH_USER_MODEL = "login.PropaUser" 

altro models.py

class Word(models.Model): 
    user = models.ManyToManyField(settings.AUTH_USER_MODEL) 
    deck = models.ManyToManyField(Deck) 
    word = models.CharField(max_length=100) 

    def __unicode__(self): # Python 3: def __str__(self): 
    return self.word 

Questo è ciò che funziona. Non so cosa abbia causato tutti i problemi prima, perché penso di aver provato questo metodo prima di pubblicare questa domanda. Questa potrebbe non essere una risposta soddisfacente, ma questo è ciò che funziona. In precedenza ero anche confuso su quello che serve semplicemente per aggiungere un campo all'utente esistente. Questo è.

+0

Ho lo stesso problema adesso. Funziona quando non si registra con qualcosa ereditato da "UserAdmin". 'admin.site.register (GUser, GUserAdmin)' vs. 'admin.site.register (PropaUser)' – toabi

+0

Quando ho provato questo con Django 1.6, ho finito per essere in grado di modificare direttamente tutti i campi direttamente (incluso il risultato hash del campo password incorporato)! – aaaronic