我正在使用django-registration软件包。我不希望人们拥有用户名,而是输入他们的名字和姓氏。喜欢在Facebook上。我怎么能这样做?
答案 0 :(得分:2)
Django auth(以及扩展程序管理员)需要一个用户名 - 完全停止。所以你必须努力解决这个问题。
您需要考虑以下几个问题: 1)名字姓氏将迅速导致碰撞。当第二个“John Smith”想要注册时,您的服务会怎样做?
2)您必须创建用户名,因此您可能会使用firstname_lastname的哈希值。再次,当你获得第二次完全匹配时你会怎么做?
3)你必须编写一个自定义身份验证后端来处理登录,这实际上并不那么难。
可以找到#2解决方案的原型here - 基本上在表单处理中,生成随机唯一哈希。
while True:
self.cleaned_data['username'] = str(md5(str(self.data['email']) + str(random.random())).hexdigest())[0:30]
try:
user = User.objects.get(username__iexact=self.cleaned_data['username'])
except User.DoesNotExist:
break
答案 1 :(得分:2)
您需要定义自己的AUTHENTICATION_BACKEND并在settings.py中声明: 即:
AUTHENTICATION_BACKENDS = (
'yourapp.backends.NoUsernameModelBackend',
)
代码应如下所示:
class NoUsernameModelBackend
def authenticate(self, first_name=None,last_name, password=None):
try:
user = User.objects.get(first_name=first_name,last_name=last_name)
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
然后,您需要定义自己的AuthenticationForm以获取first_name和last_name而不是用户名,并相应地定义url模式。
在网址中:
(r'^login/?$','django.contrib.auth.views.login', {'authentication_form':'FullNameAuthenticationForm'}, 'login'),