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

2024-05-16 21:03:08 发布

您现在位置:Python中文网/ 问答频道 /正文

默认Django的User模型有一些字段和验证规则,我并不真正需要它们。我想使注册尽可能简单,即要求要么电子邮件或用户名,或电话号码-所有这些都是唯一的,因此作为用户识别良好。

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

我以前使用过user profile django应用程序来向用户添加一个profile,但这次我更希望将类设置为mimal。但是我仍然想使用User类,因为它给了我一种简单的方法,使站点的某些部分仅限于登录的用户。

我该怎么做?


Tags: django用户模型应用程序角色规则电子邮件电话号码
3条回答

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

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

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

如果向后兼容不是问题的话,我很想看到对django.contrib.auth和用户模型做了很多改进,使它们更加灵活。但在当前的限制条件下,你可以用一点创造力做很多事情。

Django用户模型的结构非常合理。例如,您真的不想在用户名中允许任意字符,而且有一些方法可以实现email address login,而无需修改基本模型。

为了简单地存储用户帐户周围的附加信息,Django支持用户配置文件的概念。虽然您不需要依赖内置的支持来处理这个问题,但这是一个普遍遵循的约定,它将允许您很好地使用在以太中漂浮的可重用Django应用程序。有关详细信息,请参见here

如果你真的想修改核心用户模型,但又想“玩得好”依赖它的可重用应用程序,你就打开了一个潘多拉的盒子。开发人员对核心库的结构做出基本假设,因此任何更改都可能导致意外的破坏。但是,您可以对基本模型进行monkeypatch更改,或者在本地分支Django的副本。我不鼓励后者,只有在你知道自己在做什么的情况下才推荐前者。

我误解了这个问题。希望这篇文章对其他人有帮助。

#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

相关问题 更多 >