【问题标题】:AttributeError: 'User' object has no attribute 'check_password' error in Django?AttributeError:“用户”对象在 Django 中没有属性“check_password”错误?
【发布时间】:2013-01-21 11:19:11
【问题描述】:

我有一个正在尝试进行身份验证的自定义模型:

class User(models.Model):
    #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)
    #last_login = models.DateTimeField()

    objects = UserManager()
    USERNAME_FIELD = 'username'
    #check_password(password)
    class Meta:
        db_table = u'galaxy_user'

我在“设置”中提到过。

AUTH_USER_MODEL = 'fileupload.user'

 #views.py
        def login_backend(request):
            if request.method == 'POST':
                username = request.POST['username']
                password = request.POST['password']
                user = authenticate(username=username, password=password)
                if user is not None:
                    login(request, user)
                    return HttpResponseRedirect('/overview/')
                else:
                    return HttpResponseRedirect('/login_backend/')
            else:
                return render_to_response('login_backend.html', context_instance=RequestContext(request))

但是我收到了这个错误:

AttributeError: 'User' object has no attribute 'check_password' error 

我做错了什么?

【问题讨论】:

  • 为什么要覆盖用户模型?如果您想为用户添加其他字段信息,只需扩展它。不要覆盖它。
  • 这是一个全新的模型,我只是将它命名为用户。
  • 是的,我知道,但不要使用用户模型,因为 django 使用它作为默认模型。您遇到了 check_password 错误,因为真实的 User 模型有一个内置函数,但您自定义的 User 模型没有。
  • 将模型重命名为 GalaxyUser 没有帮助:(
  • 它正在重现同样的错误。

标签: django django-authentication


【解决方案1】:

the documentation for Django 1.5(这是第一个带有 AUTH_USER_MODEL 的)中显示了替代用户模型必须具有的方法,其中之一是 check_password。所以,IMO,你有两种方法可以解决你的问题。

  1. 正确替换 User 模型,提供所有必需的方法。
  2. 忘记替换 User 模型和 just write a custom AUTH BACKEND 而不包括“AUTH_USER_MODEL”

【讨论】:

  • 如何提供所有需要的方法?
  • 只需添加AbstractBaseUser中定义的所有方法
  • 这就是我想要做的,但在哪里添加?
  • 到你正在写的用户模型
【解决方案2】:

获取Django 1.5 RC。并按照these instructions 编写自定义用户类。

【讨论】:

  • 我使用的是 Django 1.5 RC。我正在按照指示进行操作。发现我需要添加 check_password 方法但添加在哪里?
  • 您的User 模型不是从AbstractBaseUser 派生的,这就是它没有check_password 方法的原因。你应该有类似class MyUser(AbstractBaseUser):
  • 另外,不要忘记在settings.py 中提及以下行:AUTH_USER_MODEL = '<your_app>.<your_model>'
  • 我这样做了,但我得到了这个错误:FieldError:类“用户”中的本地字段“密码”与基类“AbstractBaseUser”中类似名称的字段冲突之后我评论了密码字段,但正确的用户名和密码被认证为假
  • 那是因为AbstractBaseUser 类已经定义了它。您只需添加未在AbstractBaseUser 中定义的自定义字段。或者,您可以从 AbstractUser 继承,它提供了更高级的功能(用户名、权限等)。我建议你看看源代码($PATH_TO_DJANGO_SOURCE/django/contrib/auth/models.py)
【解决方案3】:

custom user documentation 中所述,您的 User 模型必须继承自 django.contrib.auth.models.AbstractBaseUser,这会添加所有相关方法。

【讨论】:

  • 我这样做了,但我得到了这个错误:FieldError:类“用户”中的本地字段“密码”与基类“AbstractBaseUser”中类似名称的字段冲突之后我评论了密码字段,但正确的用户名和密码被认证为假。
【解决方案4】:

在 get_user_model 之后从 django.contrib.auth.hashers import check_password 添加

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多