DJango中文用户名与email认证的解决方案

作者:半瓶墨水   链接:http://www.2maomao.com/blog/django-unicode-username/

DJango中username要求是字母数字或者下划线,唉,真土,web都2.0了,还只给注册英文用户名。
而且现在多数网站用邮箱地址做认证,而DJango的认证函数是:authenticate(username=’foo’, password=’bar’),又不想自己写一个backend

怎么办呢?绕道吧。

中文用户名
1. 因为username是必须的,所以找个方法构造一个吧,比如查出目前最大的ID,把ID加一作为用户名
2. 然后把firstname作为中文用户名
3. 做registerform的时候自己写,认证的时候就按firstname来搜

email认证
1. 注册的时候用form validate的方式保证其唯一性
2. 登陆的时候,先用email查出用户名再用authenticate函数。

不知道这样做有没有什么坏处,或者目前还有什么更好的方法,请高手指教。

BTW: 我喜欢把所有验证、认证代码发在form里,view中只做事情就行了
更加BT的W: 可以在login form里面通过检查是否包含@来做email、用户名双登陆。

6 条评论 发表在“DJango中文用户名与email认证的解决方案”上

  1. kevin.anew说道:

    中文用户名我发现没有什么问题,很容易解决。
    但email登陆有点麻烦,虽然有人写了一个 backend,但问题还是很多,主要就是 email 字段在user表可能在注册时会出现重复email。我现在是手动先查找一下,但感觉这样非常破坏代码的美感。

  2. 兔毛猫说道:

    @kevin.anew
    中文用户名如果不绕道的话在Admin界面就有问题
    Email登陆我倒觉得不是很麻烦,用Newform在clean_email里面做验证,很方便啊 :v

  3. kevin.anew说道:

    我是直接放在 newform 的 save 里,但是这样数据库的效率感觉总是非常低。
    在 save 时看看有没有错误,没有就在 save 时直接插入 User ,有的话就返回一个 newform.errors
    我不知道你在 clean_email 里如何写的,方便的话,mail 一份代码给我,讨论讨论~~ Django的auth模块设计的不怎么样~~

  4. 兔毛猫说道:

    @kevin.anew
    好的,欢迎Gmail讨论。

  5. shijie说道:

    contrib.auth.forms.UserCreationForm 中
    username = forms.RegexField(label=_(“Username”), max_length=30, regex=r’^\w+$’,help_text = _(“Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores).”),

    把regex=r’^\w+$’改为regex=r’^\S+$’即可。

  6. Randi说道:

    Great alrtice, thank you again for writing.

留下回复