默认的Django的User
模型有一些我不需要的字段和验证规则。我希望注册尽可能简单,即需要电子邮件或用户名或电话号码 - 所有这些都是唯一的,因此很好用户标识符。
我也不喜欢在Django用户模型中验证的用户名的默认字符集。我想在那里允许任何角色 - 为什么不呢?
之前我使用了用户配置文件django应用程序向用户添加了一个配置文件 - 但这次我宁愿让这个类变得更像。但是我仍然希望使用User
类,因为它为我提供了一种简单的方法,可以仅为登录的用户限制部分网站。
我该怎么办?
答案 0 :(得分:9)
您可以直接重新调整现有字段的用途,而不是直接修改User类或进行子类化。
对于一个网站,我使用“first_name”字段作为用户的“公开显示的名称”,并将其中的一个细分版本填入“用户名”字段(用于URL)。我写了一个自定义身份验证后端,允许人们使用他们的“公共名称”或他们的电子邮件地址登录,并且我在注册时强制执行这两者的唯一性。这与其他可重用的应用程序很好地配合,并且不会引入额外的表或查询。
对于另一个网站,我根本不需要用户名,只需要唯一的电子邮件。为了满足Django对唯一用户名的需求,我只是对电子邮件地址进行了哈希处理并将其用作用户名(您必须对哈希进行base64编码以将其压缩到30个字符以下)。自定义身份验证后端以允许使用电子邮件登录。
如果向后兼容性不是问题,我希望看到django.contrib.auth和用户模型有很多改进,以使它们更灵活。但是你可以在目前的限制范围内做很多事情并且有一点创造力。
答案 1 :(得分:7)
Django用户模型的结构非常合理。例如,你真的不想在用户名中允许任意字符,并且有一些方法可以实现email address login,而不会破坏对基本模型的更改。
为了简单地在用户帐户周围存储其他信息,Django支持用户配置文件的概念。虽然你不需要依赖内置的支持来处理这个问题,但这是一个常见的惯例,它可以让你在以太网中漂浮的可重用Django应用程序中发挥出色。有关详细信息,请参阅here。
如果您想要实际修改核心用户模型,而且还要使用依赖它的可重用应用程序“玩得很好”,那么您将打开一些潘多拉盒子。开发人员对核心库的结构做出基本假设,因此任何更改都可能导致意外破坏。尽管如此,您可以对基本模型进行monkeypatch更改,或在本地分支Django的副本。我会劝阻后者,如果你知道你在做什么,只会推荐前者。
答案 2 :(得分:7)
我误解了这个问题。希望这篇文章对其他任何人都有帮助。
#in models.py
from django.db.models.signals import post_save
class UserProfile(models.Model):
user = models.ForeignKey(User)
#other fields here
def __str__(self):
return "%s's profile" % self.user
def create_user_profile(sender, instance, created, **kwargs):
if created:
profile, created = UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_user_profile, sender=User)
#in settings.py
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile'
每次创建用户时,都会创建一个userprofile。 然后你可以使用
user.get_profile().whatever
以下是来自文档的更多信息
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
答案 3 :(得分:0)
如果您致力于避免已经指出的基于配置文件的自定义,那么您将面临一个两难的问题。
User
模型本身CustomUser
类,继承User
或复制其功能。后一个建议意味着你必须实现User
自动手动完成的一些事情,但我想知道这是否与听起来一样糟糕,特别是如果你在项目的开头。所有你需要做的就是重写一个中间件类和一些装饰器。
当然,我不认为这会给你买任何不会得到你的东西,除非你的{django svn update
你的项目不应该破坏。它可以避免与其他应用程序的一些兼容性问题,但我的猜测是大多数问题都存在。
答案 4 :(得分:0)
有多种方法可以做到这一点,但这就是我要做的事情:我允许用户输入电子邮件,用户名(必须包含至少一个字母且没有@
个符号)或手机号码。然后,当我验证它时:
@
。如果是这样,请将其设置为用户的电子邮件,并将其正确哈希并将其设置为用户名。+
。然后,删除相应的字符并将其存储为手机号码和用户名(如果您将手机号码存储在另一个型号中用于短信或其他目的)。我也会在登录时同样验证用户/电话/电子邮件字段并查看相应的位置,以便用户注册其手机号码然后更改其用户名(用于其他目的),他们仍然可以使用手机号码登录。