【问题标题】:FieldError: Local field 'password' in class 'User' clashes with field of similar name from base class 'AbstractBaseUser'?FieldError:“用户”类中的本地字段“密码”与基类“AbstractBaseUser”中类似名称的字段冲突?
【发布时间】:2013-02-23 19:20:33
【问题描述】:

我正在使用 Django 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

【问题讨论】:

  • 删除密码字段后出现什么错误?
  • 我没有收到任何错误。即使我提供了正确的密码,它也会返回 None 这就是我无法登录的原因。

标签: django django-authentication django-1.5


【解决方案1】:

与普通的python继承不同,Django中不允许“隐藏”字段名称

只需使用抽象用户提供的密码字段并在保存方法或表单/api中进行任何自定义保存/检查

阅读此处了解更多信息:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2015-02-12
    • 2014-06-13
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多