【发布时间】: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