如何更改默认的django用户模型以满足我的需求?

时间:2009-05-22 05:01:10

标签: python django django-models

默认的Django的User模型有一些我不需要的字段和验证规则。我希望注册尽可能简单,即需要电子邮件或用户名或电话号码 - 所有这些都是唯一的,因此很好用户标识符。

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

之前我使用了用户配置文件django应用程序向用户添加了一个配置文件 - 但这次我宁愿让这个类变得更像。但是我仍然希望使用User类,因为它为我提供了一种简单的方法,可以仅为登录的用户限制部分网站。

我该怎么办?

5 个答案:

答案 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)

如果您致力于避免已经指出的基于配置文件的自定义,那么您将面临一个两难的问题。

  1. 根据Daniel的建议更改User模型本身
  2. 编写CustomUser类,继承User或复制其功能。
  3. 后一个建议意味着你必须实现User自动手动完成的一些事情,但我想知道这是否与听起来一样糟糕,特别是如果你在项目的开头。所有你需要做的就是重写一个中间件类和一些装饰器。

    当然,我不认为这会给你买任何不会得到你的东西,除非你的{django svn update你的项目不应该破坏。它可以避免与其他应用程序的一些兼容性问题,但我的猜测是大多数问题都存在。

答案 4 :(得分:0)

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

  1. 检查是否存在@。如果是这样,请将其设置为用户的电子邮件,并将其正确哈希并将其设置为用户名。
  2. 检查是否只有数字,破折号和+。然后,删除相应的字符并将其存储为手机号码和用户名(如果您将手机号码存储在另一个型号中用于短信或其他目的)。
  3. 如果不是,只需将其设置为用户名。
  4. 我也会在登录时同样验证用户/电话/电子邮件字段并查看相应的位置,以便用户注册其手机号码然后更改其用户名(用于其他目的),他们仍然可以使用手机号码登录。