【问题标题】:Django Custom User and AuthenticationFormDjango 自定义用户和 AuthenticationForm
【发布时间】:2018-04-20 23:44:52
【问题描述】:

我发现其他人的解决方案很有帮助,但我仍然遇到问题。

使用自定义用户模型并使用表示支持自定义用户模型的AuthenticationForm,我不断收到此错误:Please enter a correct username and password. Note that both fields may be case-sensitive.

我也无法使用authentication 函数,因为它总是返回None


我的settings.py,其中inventory 是我的应用名称。

AUTH_USER_MODEL = 'inventory.User'

这是我在views.py中的登录部分

def login_view(request):
    context = {}
    if request.method == 'POST':
        # print(request.POST)
        form = AuthenticationForm(data=request.POST)
        print(form)
        if form.is_valid():
            print('yay')

    elif request.method == 'GET':
        context['form'] = AuthenticationForm()

    return render(request, 'inventory/login.html', context)

这是我的models.py

class UserManager(AbstractUserManager):
    def create_user(self, username, first_name, last_name, perm, password):
        if not username:
            raise ValueError('Users must have a username')
        if not first_name:
            raise ValueError('Users must have a first name')
        if not last_name:
            raise ValueError('Users must have a last name')
        if not perm:
            raise ValueError('Users must have a position')

        user = self.model(
            username=username,
            first_name=first_name,
            last_name=last_name,
        )

        if perm == 'e':
            user.employee = True
        elif perm == 'm':
            user.manager = True
        elif perm == 'o':
            user.owner = True

        user.set_password(password)
        user.save(using=self._db)
        return user



class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(verbose_name='username', max_length=50, unique=True,)
    first_name = models.CharField(verbose_name='first name', max_length=50,)
    last_name = models.CharField(verbose_name='last name', max_length=50,)
    active = models.BooleanField(default=False)

    employee = models.BooleanField(default=False)
    manager = models.BooleanField(default=False)
    owner = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
        return self.first_name + ' ' + self.last_name

    @property
    def is_employee(self):
        return self.employee

    @property
    def is_manager(self):
        return self.manager

    @property
    def is_owner(self):
        return self.owner

    @property
    def is_active(self):
        return self.active

    objects = UserManager()

这里是login.html

<form method="POST" action="{% url 'login' %}">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="login" />
</form>

我已经搜索了几个小时试图弄清楚我的问题是什么,查看AuthenticationForm 文档/代码以查看它是否以某种方式搜索 auth.User 对象而不是我的 inventory.User 对象,但它没有出现是,尤其是在文档声明它可以与自定义用户模型一起使用之后,只要您在 settings.py 中定义 AUTH_USER_MODEL。提前致谢。

【问题讨论】:

  • 你检查过用户是否在数据库中吗?
  • 是的,我做了比尔。
  • 首先你应该将objects = UserManager()添加到你的使用模型中,其次你应该为你的用户模型扩展PermissionsMixin,比如from django.contrib.auth.models import PermissionsMixin class User(AbstractBaseUser, PermissionsMixin):
  • objects = UserManager() 目前实际上位于模型的底部。好的,我将添加 PermissionsMixin。
  • @Ykh 好的,我在 mixin 中添加了,但我没有用它做任何事情,但仍然得到同样的错误,正如预期的那样。

标签: python django django-authentication


【解决方案1】:

你在问题​​的顶部说:

我也无法使用authentication 函数,因为它总是返回None

你是说 djangos authenticate function 吗?如果该函数返回None,那么您的AuthenticationForm 将继续登录失败。

尝试类似下面的代码:

from django.contrib.auth import authenticate
print(request.POST)
user = authenticate(**request.POST)  # pass all the keys to the function
if user is not None:
    print('A backend authenticated the credentials.')
    # Now you can try your Form again.
else:
    print('ERROR: no backend authenticated the credentials.')
    # Your Form will never login the user.

如果这不起作用,您的AuthenticationForm 也可能不起作用。

【讨论】:

  • 仍然不起作用,我想我知道为什么它不起作用,但我不确定。如果我有一个扩展 AbstractBaseUser 的自定义模型,则身份验证不起作用可能是因为我在使用自己的模型时需要定义自己的身份验证后端(但不知道为什么)。如果我只是扩展 AbstractUser,我可以使用 AuthenticationForm 没问题。我可能最终会回答我自己的问题。
猜你喜欢
  • 2021-09-01
  • 2019-05-16
  • 2017-06-26
  • 2019-06-05
  • 1970-01-01
  • 2015-09-23
  • 2013-09-15
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多