2009-05-22 58 views
11

默认的Django的User模型有一些字段和验证规则,我并不真正需要。我想尽可能简单地进行注册,即需要电子邮件或用户名或电话号码 - 所有这些都是唯一的,因此用户标识符很好。如何更改默认的django用户模型以适合我的需求?

我也不喜欢在Django用户模型中验证的用户名的默认字符集。我想允许任何角色 - 为什么不呢?

我之前使用用户配置文件django应用程序向用户添加配置文件 - 但是这一次我宁愿让这个类变得简单。但我仍然希望使用User类,因为它使我可以轻松地让部分站点仅限用户登录。

我该怎么做?

回答

8

与其直接修改用户类或进行子类化,您也可以重新调整现有字段的用途。

对于一个站点,我使用“first_name”字段作为用户的“公开显示的名称”,并将“slugified”的版本填入“用户名”字段(用于URL)。我写了一个自定义auth后端,允许用户使用他们的“公共名称”或他们的电子邮件地址登录,并且我在注册时强制这两个人的唯一性。这与其他可重用应用程序很好地搭配,并不会引入额外的表格或查询。

对于另一个网站,我根本不想用户名,只有唯一的电子邮件。为了满足Django对唯一用户名的需求,我只是散列电子邮件地址,并将其用作用户名(您必须对散列进行64位编码以将其压缩到30个字符以内)。自定义身份验证后端允许使用电子邮件登录。

如果向后兼容性不是问题,我希望看到对django.contrib.auth和User模型有很多改进,使它们更加灵活。但是,在目前的限制条件下,你可以用很少的创造力来做很多事情。

7

Django用户模型的结构非常明智。例如,您真的不想允许用户名中的任意字符,并且有方法可以实现email address login,而不会修改基本模型。

为了简单地存储用户帐户的附加信息,Django支持用户配置文件的概念。虽然你不需要依靠内置的支持来处理这个问题,但这是一种常见的惯例,它可以让你在以太网中浮动的可重用Django应用程序中玩得很开心。有关更多信息,请参阅here

如果您想要真正修改核心用户模型,并且可以使用可重复使用的应用程序“玩得开心”,那么您就打开了一个潘多拉的盒子。开发人员对核心库的结构做出基本假设,因此任何更改都可能导致意外中断。但是,您可以修改基本模型的更改,或在本地分支Django的副本。我会劝阻后者,只有在你知道你在做什么时才推荐前者。

+6

Django用户模型的结构“合理”,因为如果您正在构建网站,那么对于特定的一组需求,这将是一个合理的用户模型。但作为框架的核心用户抽象,它留下了一些需要的灵活性。 – 2009-05-22 15:12:14

+2

我同意一个更可插拔的认证系统将是可取的 – 2009-05-23 06:37:14

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' 

这将创建一个用户配置文件,如果每一个创建它的用户保存时间。 然后,您可以使用

user.get_profile().whatever 

下面是从文档

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

0

你面对一个有点进退两难这实际上有两个解决方案,如果你致力于避免了曲线的一些更多的信息为基础的定制已经指出。

  1. 更改User模型本身,每丹尼尔的建议
  2. CustomUser类,继承User或复制其功能。

后者建议意味着你将不得不实施一些事情,User自动手动做,但我不知道,因为它的声音,特别是如果你在你的项目一开始就知道是否是坏。你所要做的就是重写一个中间件类和一些装饰器。

当然,我不认为这会向您购买任何不会让您获得的东西,除非您的项目不应该因为您的django svn update而中断。它可以避免与其他应用程序的一些兼容性问题,但我的猜测是大多数问题都会以任何方式存在。

0

有很多方法可以做到这一点,但这是我会做的:我会允许用户输入电子邮件,用户名(必须包含至少一个字母,不包含@符号)或手机号码。然后,当我验证它时:

  1. 检查是否存在@。如果是这样,请将其设置为用户的电子邮件,并对其进行适当的散列并将其设置为用户名。
  2. 检查它是否只有数字,破折号和+。然后,去掉适当的字符并将其存储为手机号码和用户名(如果您将移动号码存储在另一个型号中以用于SMS目的)。
  3. 如果不是,请将其设为用户名。

我也会在登录时验证用户/电话/电子邮件字段,并在相应位置查找,以便用户注册其手机号码,然后更改其用户名(对于其他用户目的),他们仍然可以用他们的手机号码登录。