代码之家  ›  专栏  ›  技术社区  ›  Dmitry Gladkov

Django中的用户名电子邮件

  •  18
  • Dmitry Gladkov  · 技术社区  · 14 年前

    1. 最糟糕的一个:用户名字段受 max_length=30 varchar(30) EmailField varchar(75) 除非您手动更改表。
    2. 你需要将你的电子邮件数据存储在用户名和电子邮件字段中,以便 User.email_user() 工作。我想还有别的地方 User.email
    3. 代码可读性失败。当然,其他djangonaut知道这个陷阱,但是将名为“username”的字段(尤其是在仍然有email字段的情况下)视为email显然会降低代码的可理解性。

    另一种方法是使用 email 字段,但仍然存在问题:

    authenticate(self, email=None, password=None)
    
    1. 没有 unique=True
    2. 你必须面对 username 唯一=真 ,方法是将其从表中完全删除或更改为允许NULL并删除索引。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Tom Christie    12 年前

    django-email-as-username 如果你想删除用户名,并且只使用电子邮件,那么它应该可以做你需要的一切。

    简要概述如下:

    1. 提供用于创建用户的电子邮件验证后端和帮助程序功能。
    2. 修补Django管理员以处理基于电子邮件的用户身份验证。

    在引擎盖下,用户名是电子邮件的散列版本,这意味着我们不局限于Django的用户名30个字符的限制(只是普通的电子邮件75个字符的限制)

    编辑

        2
  •  5
  •   Jim McGaw    9 年前

    大卫·克莱默想出了一个我喜欢的解决这个问题的办法。我目前正在一个生产网站上使用它,用户必须能够登录使用他们的电子邮件或用户名。你可以在这里找到它:

    Logging In With Email Addresses in Django

    如果表单上提供的登录名是电子邮件(包含“@”符号),它将尝试使用该名称进行身份验证,如果不是电子邮件,则返回用户名。(当然,你只需要确保你的登记表中有这项工作的电子邮件。)

        3
  •  0
  •   maraujop    14 年前

    在Django中,我不必使用电子邮件作为用户名,但我想您可以创建一个UserProfile模型并将字段聚合到其中,就像另一个电子邮件字段一样,并使其唯一。所以你可以user.get\u配置文件()。请发送电子邮件进行身份验证。

    我想另一种方法是继承User并重新定义字段,但我认为Django开发人员仍然不推荐这样做。

    最后,您可以定义自己的自定义用户模型并返回django.contrib.auth公司.模型.用户为了一些逻辑。

    在Django中更改用户表的代码:

     from django.db import connection
     cursor = connection.cursor()
     cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL")