Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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'
like image 243
chirale Avatar asked Dec 17 '12 14:12

chirale


1 Answers

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.

like image 188
Christian Jensen Avatar answered Nov 17 '22 22:11

Christian Jensen