2012-12-17 10 views
7

Utilizzo del nuovo Configurable user model da Django 1.5 (1, 5, 0, 'beta', 2) ottengo questo errore durante l'esecuzione manage.py createsuperuser cercando di impostare una chiave esterna di un campo obbligatorio:Chiave esterna come campo obbligatorio nel modello utente configurabile di Django 1.5, createsuperuser dice: AttributeError: L'oggetto 'NoneType' non ha attributo '_state'

AttributeError: 'NoneType' object has no attribute '_state'

Dal momento che ho un fixtures/initial_data.yaml con i valori di cui ho bisogno per il mio modello di utente, flusso di lavoro è:

  1. Creare database
  2. python manage.py syncdb
  3. Rispondi "no" alla domanda Hai appena installato il sistema di autenticazione di Django, il che significa che non hai alcun superutente definito. Ti piacerebbe crearne uno adesso? (Sì/no)
  4. installate 14264 oggetti (s) da 1 proiettore (s)
  5. pitone manage.py createsuperuser

cerco di creare superutente dopo infissi sono importati, quindi questo è non è un problema causato da una tabella di database vuota per il modello City.

codice estratto, sulla base di documentation:

models.py

class City(models.Model): 
    city = models.CharField(max_length=70, help_text="City.") 
    state = models.CharField(max_length=2, help_text="State.") 
    class Meta: 
     ordering = ['city'] 
    def __unicode__(self): 
     return "%s (%s)" % (self.city, self.state) 

class PersonaManager(BaseUserManager): 
    [...] 
    def create_superuser(self, email, name, birthplace, password): 
     """ 
     Creates and saves a superuser with the given email, date of 
     birth and password. 
     """ 
     user = self.create_user(email, 
      password=password, 
      name=name, 
      birthplace=birthplace, 
     ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 

class Person(AbstractBaseUser): 
    email = models.EmailField(
     verbose_name='email address', 
     max_length=255, 
     unique=True, 
     db_index=True, 
    ) 
    name = models.CharField(max_length=60) 
    birthplace = models.ForeignKey('myapp.City', related_name="person_birthplace") 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = PersonaManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['name', 'birthplace'] 

Come posso ottenere la chiave esterna a lavorare sul mio modello di utente su un campo obbligatorio? Grazie.

Edit: Traceback da manage.py createsuperuser --traceback:

Traceback (most recent call last): 
    File "/home/asd/Envs/envdjango15/local/lib/python2.7/site-packages/django/core/management/base.py", line 222, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/asd/Envs/envdjango15/local/lib/python2.7/site-packages/django/core/management/base.py", line 252, in execute 
    output = self.handle(*args, **options) 
    File "/home/asd/Envs/envdjango15/local/lib/python2.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 112, in handle 
    user_data[field_name] = field.clean(raw_value, None) 
    File "/home/asd/Envs/envdjango15/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 211, in clean 
    self.validate(value, model_instance) 
    File "/home/asd/Envs/envdjango15/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 1014, in validate 
    using = router.db_for_read(model_instance.__class__, instance=model_instance) 
    File "/home/asd/Envs/envdjango15/local/lib/python2.7/site-packages/django/db/utils.py", line 142, in _route_db 
    return hints['instance']._state.db or DEFAULT_DB_ALIAS 
AttributeError: 'NoneType' object has no attribute '_state' 
AttributeError: 'NoneType' object has no attribute '_state' 
+1

Dove si trova lo stacktrace completo? – borges

+0

Ho eseguito creauperuser con l'opzione traceback: ho incluso il risultato sopra. – chirale

+1

Stai usando più database nel tuo ptoject? – OrPo

risposta

3

non al 100% sicuro che questo sarà risolvere il problema, ma solo per calci, virare sulla PermissionsMixin e tirare fuori l'is_superuser fuori il vostro modello.

Forse c'è una sorta di controllo delle autorizzazioni in corso sullo sfondo - garantito che non dovrebbe accadere ma dargli una possibilità.

Il mio sospetto deriva dal concetto di esso che tenta di individuare quali autorizzazioni modello è necessario applicare.