【问题标题】:Unicode characters in Django usernamesDjango 用户名中的 Unicode 字符
【发布时间】:2012-08-24 11:50:20
【问题描述】:

我正在使用 Django 1.4 开发一个网站,并在注册过程中使用 django-registration。事实证明,当用户输入时,Unicode 字符不允许作为用户名。作为用户名一部分的中文字符注册失败:

该值只能包含字母、数字和@/./+/-/_ 字符。

是否可以更改它以便在用户名中允许使用 Unicode 字符?如果是,我该怎么做?还有,会不会有什么问题?

【问题讨论】:

  • 在检索用户名和其他字段时,您可以尝试将它们编码为 utf-8,然后将其存储。尝试 -> 编码('utf-8')。
  • 感谢您的建议。一位来自新加坡的用户向我报告说,当他尝试使用仅包含拉丁字符的用户名进行注册时,他可以看到上述错误消息。他的系统和键盘配置为输入中文字符,所以我怀疑他在表单中输入的任何内容都被编码为 Unicode。您认为转换为 utf-8 会解决此问题吗?
  • 是的,它应该可以解决问题。查看我们的网站 www.vialogues.com,尝试使用任何外语创建帐户。我们使用相同的东西,转换为 utf-8。
  • 谢谢,你也使用 django-registration 吗?请问你在哪里转换成utf-8?
  • 刚刚创建了一个带有一些波兰变音符号的帐户

标签: python django unicode internationalization django-registration


【解决方案1】:

这真的不是问题 - 因为这个字符限制仅在我记得的 UserCreationForm(或 django-registration 中的 RegistrationForm)中,并且您可以轻松地制作自己的,因为数据库中的字段只是普通的 TextField。

但这些限制并非没有原因。我现在能想到的一个可能的问题是创建链接 - 用户名通常用于此目的,它可能会导致问题。用户名看起来相同但实际上字符不同等的假帐户的可能性也更大。

【讨论】:

  • 您的回答完全不准确。好吧,不是完全,关于仅由表单施加的限制的一点是正确的。然而,Django 和每一个现代浏览器都是完全支持 unicode 的。 Unicode 在 URL 中是完全可以接受的。此外,每个 unicode 字符都是唯一的字节码,因此 blahbláh 相同,可以同时用作用户名。
  • 我是说浏览器在任何地方都无能为力吗?好吧 - 我完全不是在谈论字节码,而是在谈论字符的外观以及它对用户来说有多么混乱 - f.e.告诉我“Аnnа”和“Anna”之间的区别,它们是 unicode 中完全不同的字符串。很有可能将其用于某种骗局。
  • @jasisz 您能否详细说明我应该如何取消限制?另外,在您的示例中,“Аnnа”和“Anna”之间的真正区别是什么?
  • 如果您使用的是普通的 Django UserCreationForm,只需扩展它并覆盖用户名字段(它最初是 RegexField,如果这是您真正需要的,您可以将其设为 TextField)。在我的示例中,两个“a”都在Anna 的其中一个是西里尔字母,看起来与“正常”相同,但字节码完全不同。
  • 谢谢。扩展UserCreationForm 似乎很容易,但是如何让django-registration 使用扩展类而不是原始UserCreationForm?这是我不明白的事情。
【解决方案2】:

Django 1.10 现在正式支持 unicode 用户名,见:

django.contrib.auth 中的 User 模型原本只接受 ASCII 用户名中的字母。虽然不是刻意选择,但 Unicode 使用 Python 3 时始终接受字符。

用户名验证器现在通过以下方式明确接受 Unicode 字母 仅在 Python 3 上默认。可以通过以下方式覆盖此默认行为 更改 User 模型的 username_validator 属性,或更改为任何 该模型的代理,使用 ASCIIUsernameValidator 或 Unicode 用户名验证器。自定义用户模型也可以使用那些 验证器。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2021-11-27
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多