2011-05-09 42 views

回答

2

Django身份验证(和扩展管理员)需要一个用户名 - 句号。所以你必须付出一些努力来解决这个问题。

您有几个问题需要考虑: 1)名字姓将会很快导致冲突。当第二个“John Smith”想要注册时,你的服务做什么?

2)您必须创建一个用户名,因此您可能会使用firstname_lastname的散列。再次,当你第二次完全匹配时,你会做什么?

3)您将不得不编写自定义auth后端来处理登录,这实际上并不困难。

解决方案#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 
+0

我非常感谢你。 – Jim 2011-05-09 21:24:31

+1

我不能只使用电子邮件地址作为用户名吗? – Jim 2011-05-09 21:26:09

+0

@jim您不能使用电子邮件,因为该字段太小(30个字符),并且字段验证不接受@。但是你可以用_替换@或者其他东西,如果地址太长,特殊情况会处理碰撞。您仍然需要自定义身份验证。 – 2011-05-09 21:46:47

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'), 
+0

这段代码在那里,但除非你保证(名字,姓氏)是唯一的,否则如果你有两个约翰史密斯,User.objects.get(...)将会失败。 – Ted 2011-05-10 02:17:23

+0

@Ted当然这是一个奇怪的要求,以避免用户名,并要求登录完全基于名字和姓氏,但这是他问。这是做到这一点的一种方式。其实你可以重新使用一些代码来让人们用电子邮件登录(这是一个更可能的用例) – 2011-05-12 14:21:36

+0

哦,我跟着,我只是指出,如果你的解决方案被使用,你还必须确保在编程上,每个First-Last组合只有一个人。 – Ted 2011-05-13 17:59:20