Django注册,名字和姓氏,没有用户名

时间:2011-05-09 20:46:35

标签: django facebook registration username

我正在使用django-registration软件包。我不希望人们拥有用户名,而是输入他们的名字和姓氏。喜欢在Facebook上。我怎么能这样做?

2 个答案:

答案 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'),