2012-12-17 3 views
7

Mit der neuen Configurable user model von Django 1.5 (1, 5, 0, 'Beta', 2) ich diesen Fehler während manage.py createsuperuser laufen versuchen, einen Fremdschlüssel eines erforderlichen Feldes zu setzen:Fremdschlüssel als erforderliches Feld auf Django 1.5 konfigurierbar Benutzermodell, createsuperuser sagt: AttributeError: 'NoneType' Objekt hat kein Attribut '_state'

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

Da ich eine fixtures/initial_data.yaml mit Werten habe ich für mein Benutzermodell benötigen, Workflow ist:

  1. erstellen Datenbank
  2. python manage.py syncdb
  3. Antwort "Nein" auf die Frage Sie haben gerade Djangos Auth-System installiert, was bedeutet, dass Sie keine Superuser definiert haben. Möchten Sie jetzt einen erstellen? (Ja/nein)
  4. Installed 14264 Objekt (e) von 1 Halterung (en)
  5. Python manage.py createsuperuser

Ich versuche, Super-User zu erstellen, nachdem Vorrichtungen eingeführt werden, so ist dies kein Problem, das durch eine leere Datenbanktabelle für das Stadtmodell verursacht wird.

Codeauszug, bezogen auf 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'] 

Wie kann ich den Fremdschlüssel auf meinem Benutzermodell auf ein erforderliches Feld zu arbeiten? Vielen Dank.

Edit: Traceback von 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

Wo ist der komplette StackTrace? – borges

+0

Ich habe createsuperuser mit Traceback-Option ausgeführt: Ich habe das obige Ergebnis eingefügt. – chirale

+1

Verwenden Sie mehrere Datenbanken in Ihrem ptoject? – OrPo

Antwort

3

nicht zu 100% sicher, dass dies das Problem beheben, aber nur für Tritte, tack auf der PermissionsMixin und die is_superuser aus Ihrem Modell abreißen.

Vielleicht gibt es eine Art Erlaubnisprüfung, die im Hintergrund abläuft - vorausgesetzt, es sollte nicht passieren, aber versuchen Sie es.

Mein Verdacht kommt von dem Konzept, dass es versucht herauszufinden, welche Modellberechtigungen es anwenden muss.