我想使用名字和姓氏来验证用户
这是我正在使用的代码
user = auth.authenticate(first_name = firstname,last_name = lastname,password = password)
它不断提出NoneType:无
我检查了第一个名字和姓氏以及密码被认为是正确的吗?
我做错了什么?感谢
答案 0 :(得分:3)
这里的困难在于,通常您可以通过创建实现authenticate
和get_user
的自定义身份验证后端来处理此问题。但是,authenticate
的函数签名是:
def authenticate(self, username=None, password=None):
Django中的任何地方都会调用它,只传递2个参数,用户名和密码。这意味着如果以任何其他方式完成,使用任何通用身份验证表单和管理界面之类的东西都将会中断。
我能看到的唯一工作,这有点粗略,如果用户名是作为单个条目输入的,带有字符串“First Last”(用空格分隔)代替用户名。然后你可以把它分开并使用那个值......
(这都是未经测试的,但你明白了)
class FirstLastNameBackend(object):
def authenticate(self, username=None, password=None):
first, last = username.split(' ', 1)
try:
user = User.objects.get(first_name=first, last_name=last)
if user:
# Check if the password is correct
# check if the user is active
# etc., etc.
return user
except:
pass
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except:
return None
django doc提供了很多有关自定义后端的有用详细信息:User auth with custom backend
另一方面,需要注意的是姓名中包含空格的姓氏,例如“de la Cruz”。如果在split
函数上为 maxsplit 指定1,则可以避免此问题。
答案 1 :(得分:2)
从@T建立一点点。斯通的想法。为什么不让他们注册他们的名字和姓氏,你只是将它们连接在一起并将其用作他们的用户名?每次登录时,您都会设置视图以再次组合这两个字段并使用该字符串。
您将无法使用他们可以为您制作的某些自动表格,但这并不是什么大不了的事。我只是将两个字符串组合在一起,小写它们并将其作为用户名,并为每个登录实例执行相同操作。
答案 2 :(得分:2)
您可以在后端验证功能中使用任何参数,即:
class FirstLastNameBackend(object):
def authenticate(self, first_name=None, last_name=None, password=None):
pass #your user auth code goes here
为了对用户进行身份验证,请致电
user = auth.authenticate(first_name=firstname,
last_name=lastname,
password=password)
然而,一个缺点是您需要实现自己的登录表单,并且管理界面不支持此身份验证。
答案 3 :(得分:1)
我喜欢不让用户记住用户名的想法,但我认为更好的解决方案是让他们的电子邮件地址成为他们的用户名。在您的特定应用程序中假设没有两个用户具有相同的名字和姓氏,这是否公平?如果这不是一个公平的假设,你的系统将如何处理?