在Django中覆盖用户模型吗?

时间:2012-09-26 14:55:30

标签: django

我目前正在使用Django,我必须为用户提供注册和登录的可用性。 我阅读了很多文档,每个文档都推荐扩展用户模型。 扩展用户模型是否有限制? 我是否必须构建自己的应用程序或扩展用户模型?

5 个答案:

答案 0 :(得分:1)

如果您需要在用户模型中存储更多信息,请查看this answer

对于用户注册,有一个名为django-registration的应用。

答案 1 :(得分:1)

django-registration的好处在于它区分了收集足够的信息以注册用户(这将允许他们登录到您的系统),以及收集有关该用户的其他信息。制作他们的个人资料,例如性别,dob等。 第二位可以通过多种不同方式完成,作为django-registration的作者的James Bennet也创作了django-profiles这是一个单独的应用程序,允许您灵活地构建构成用户配置文件的必填字段。

如果你想推出自己的配置文件解决方案,那么我不建议实际扩展(在对象继承意义上)Django用户模型,但是在另一个模型中指定外键关系很简单,该模型将包含所有配置文件字段,然后,您可以从任何用户实例跟踪与此配置文件模型的反向关系。

例如:

class Profile(models.Model):
    user = models.ForeignKey(User)
    nickname = models.CharField(max_length=255)

>>> user = User.objects.create_user(username='a_user', email='me@home.com', password='password')
>>> profile = Profile.objects.create(user=user, nickname='example')
>>> user.profile_set.all()[0].nickname #follow the reverse relationship from the fk in Profile
example

答案 2 :(得分:1)

此时我建议通过开发版使用Django 1.5功能。 1.5应该在11月底发布(如果我没有记错的话)。

有了它,你有一种新的特定方式来修改默认的用户模型和所有的东西,所以你在定制模型时保持了很多默认的好处(如果它是你需要做的):

https://docs.djangoproject.com/en/dev/topics/auth/#customizing-the-user-model

答案 3 :(得分:0)

这个答案变成了一个很简单的叙述,所以这里是短篇小说:

这对我来说效果很好,但如果你想在UserContext实例上使用User子类而不是auth.User,你需要做额外的工作。

<强> TLDR

我过去曾这样做过,目标是从用户名切换到基于电子邮件的登录。这增加了一些开销,因为它还需要一个新的auth后端。在正面,替换auth后端会导致RequestContext.user和HTTPRequest.user成为自定义User子类的实例。

根据我的经验,使用contrib.admin时扩展User的粘性部分。

诀窍在于,当未经身份验证/未经授权的用户尝试访问其中一个管理网址时,contrib.admin会使用自己的登录视图。当我登陆不同的登录页面时,这对我来说很明显,但如果你还没有覆盖那些,那可能就不那么明显了。这也使用标准的auth后端,所以我的RequestContexts最终得到了auth.User实例而不是我的子类。

解决方法是覆盖AdminSite并定义新的登录方法。我刚刚使用?next重定向到我的前端登录页面。

一个更简单的解决方案就是将auth.User保留在上下文中,并在用户子类上定义一个类方法,而不是跳过所有这些箍:

@classmethod
def for_auth_user(cls, auth_user):
    return cls.objects.get(user_ptr_id=auth_user.id)

这只是每个页面加载的额外数据库。你甚至可以编写一个中间件来在每个请求的开头进行交换。

答案 4 :(得分:0)