1

我目前正在使用 Django,我必须让用户可以注册和登录。我已经阅读了许多文档,并且每个文档都建议扩展用户模型。扩展用户模型有限制吗?我是否必须构建自己的应用程序或扩展用户模型?

4

5 回答 5

1

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

有了它,您就有了一种新的特定方式来修改默认用户模型和周围的所有东西,因此您在自定义模型时保留了很多默认优点(如果这是您需要做的):

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

于 2012-10-22T16:47:47.853 回答
1

django-registration的好处是它在收集足够的信息来注册用户(这将允许他们登录到您的系统)和收集有关该用户的其他信息以构成他们的个人资料之间有所区别,例如性别、出生日期等。第二点可以通过多种不同的方式完成,django-registration 的作者 James Bennet 还编写了django-profiles,这是一个单独的应用程序,允许您灵活地构建所需的字段组成用户档案。

如果您想推出自己的配置文件解决方案,那么我不建议您实际扩展(在对象继承意义上)Django User 模型,而是简单地在将保存所有配置文件字段的附加模型中指定外键关系,您可以然后从任何 User 实例遵循与此配置文件模型的反向关系。

例如:

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
于 2012-09-26T15:47:04.103 回答
1

如果您需要存储在用户模型中的更多信息,请查看此答案

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

于 2012-09-26T15:02:14.963 回答
0

django 1.5 将带来自定义用户模型:) https://docs.djangoproject.com/en/dev/releases/1.5-alpha-1/#configurable-user-model

于 2012-11-24T16:23:40.823 回答
0

这个答案变成了一个故事,所以这里是简短的部分:

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

TLDR

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

以我的经验,扩展用户的难点在于使用 contrib.admin。

诀窍是 contrib.admin 在未经身份验证/未经授权的用户尝试访问其中一个管理员 URL 时使用自己的登录视图。当我登陆不同的登录页面时,这对我来说是显而易见的,但如果你还没有覆盖这些页面,可能就不那么明显了。不过,这也使用了标准的身份验证后端,所以我的 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)

这只是每个页面加载的额外分贝。您甚至可以编写一个中间件在每个请求开始时进行此交换。

于 2012-09-26T15:59:30.840 回答