FieldError: локальное поле «пароль» в классе «Пользователь» конфликтует с полем с аналогичным именем из базового класса «AbstractBaseUser»?

Я использую Джанго 1.5. У меня есть следующая модель:

class User(AbstractBaseUser):
    #id = models.IntegerField(primary_key=True)
    #identifier = models.CharField(max_length=40, unique=True, db_index=True)
    username = models.CharField(max_length=90, unique=True, db_index=True)
    create_time = models.DateTimeField(null=True, blank=True)
    update_time = models.DateTimeField(null=True, blank=True)
    email = models.CharField(max_length=225)
    password = models.CharField(max_length=120)
    external = models.IntegerField(null=True, blank=True)
    deleted = models.IntegerField(null=True, blank=True)
    purged = models.IntegerField(null=True, blank=True)
    form_values_id = models.IntegerField(null=True, blank=True)
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True)
    objects = UserManager()
    USERNAME_FIELD = 'email'
    class Meta:
        db_table = u'galaxy_user'

Я получаю эту ошибку при запуске ./manage.py syncdb:

FieldError: Local field 'password' in class 'User' clashes with field of similar name from base class 'AbstractBaseUser'

Я попытался удалить поле пароля из модели, но он не аутентифицируется, даже если поле пароля удалено из модели. Я использую свою пользовательскую аутентификацию Django:

class AuthBackend:
    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
            kwargs = {'username': username}
        try:
            user = User.objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

person pynovice    schedule 08.03.2013    source источник
comment
какую ошибку вы получаете, когда удаляете поле пароля?   -  person Aidan Ewen    schedule 08.03.2013
comment
Я не получаю никакой ошибки. Даже если я укажу правильный пароль, он возвращает None, поэтому я не могу войти в систему.   -  person pynovice    schedule 08.03.2013


Ответы (1)


«Скрытие» имени поля не разрешено в Django, в отличие от обычного наследования Python.

просто используйте поле пароля, предоставленное абстрактным пользователем, и выполняйте любые пользовательские сохранения/проверки в методе сохранения или в форме/api

читайте здесь для получения дополнительной информации об этом:

https://docs.djangoproject.com/en/1.8/topics/db/models/#field-name-hiding-is-not-permitted

person Dr Manhattan    schedule 26.08.2015