Foreign key as required field on Django 1.5 configurable user model, createsuperuser says: AttributeError: 'NoneType' object has no attribute '_state'
Asked Answered
D

1

7

Using the new Configurable user model from Django 1.5 (1, 5, 0, 'beta', 2) I get this error while running manage.py createsuperuser trying to set a foreign key of a required field:

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

Since I've a fixtures/initial_data.yaml with values I need for my user model, workflow is:

  1. Create database
  2. python manage.py syncdb
  3. Answer "no" to the question You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no)
  4. Installed 14264 object(s) from 1 fixture(s)
  5. python manage.py createsuperuser

I try to create superuser after fixtures are imported, so this is not a problem caused by an empty database table for the City model.

Code excerpt, based on 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']

How can I get the foreign key working on my user model on a required field? Thank you.

Edit: Traceback from 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'
Devotee answered 17/12, 2012 at 14:21 Comment(6)
Where is the complete stacktrace?Laborsaving
I've executed createsuperuser with traceback option: I've included the result above.Devotee
Are you using multiple databases in your ptoject?Elastomer
No, I'm using a single database. Anyway, just omitting the otherwise compulsory fields in create_superuser definition avoid this issue.Devotee
Check this thread: #15988683Dour
You have ForeignKey('myapp.City'... Isn't ForeignKey(City... enough?Furnary
C
3

Not 100% sure that this will fix it, but just for kicks, tack on the PermissionsMixin and yank off the is_superuser off your model.

Perhaps there is some sort of permission checking thing going on in the background - granted it should not be happening but give it a shot.

My suspicion comes from the concept of it trying to sniff out what model permissions it needs to apply.

Corsiglia answered 13/9, 2013 at 5:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.