Django:如何使用自定义类作为request.user?

8
我已经扩展了Django的默认用户类,如下所示:

class CustomUser(User):
    friends = models.ManyToManyField('self', symmetrical=False)

但是现在我想在所有地方使用它,而不是默认的User类。在我的视图方法中,我可以访问request.user,但那是User类的一个实例。最简单的方法是让它返回CustomUser吗?

4个回答

6

你也可以在models.py中的某个地方“猴子补丁”现有的User模型,它应该可以正常工作。在你的代码中,继续使用原始类。

User.add_to_class('friends',models.ManyToManyField('self', symmetrical=False))

哦!要是我几天前知道这个就好了。不过还是谢谢!我已经完成那个项目了,现在不打算回头尝试这个;我只是会假设它有效。这本来是最简单的解决方案。 - mpen
当然,语法上有一个小变化(我第一次使用了friends=models.ManyToMany)。 - Evgeny

5

我不确定你是否能完全做到这一点,但是你可以使用Django的user_profile功能访问CustomUser属性。

在你的settings.py文件中:

AUTH_PROFILE_MODULE = 'myapp.CustomUser'

在您的看法中:

user_friends = user.get_profile().friends

Check out this link for more info.


我认为这需要你将User设置为外键,而不是像我使用的继承... - mpen
1
这是处理问题的首选方式。它可以避免您修改现有模块的麻烦。保持 django.contrib.auth 不变,只在您自己的代码中进行更改。 - jcdyer
对我来说,这可能是个问题还有待商榷。"首选"是个人观点和品味的问题,特别是对于一个单人团队。@jcd - Evgeny
AUTH_PROFILE_MODULE已被移除。应使用AUTH_USER_MODEL - blueyed

3

这里有一个关于扩展Django用户模型的解释,点击这里。使用身份验证后端解决了request.user问题。按照作者的指示实现了自定义用户,并且一直以来都很满意。


我发现了这个并尝试了一下,但似乎无法使其工作。在我看来,你甚至不需要替换后端。 - mpen
问题是什么?我对自定义后端很熟悉,但如果您不想使用它,您可以编写一个中间件,正如在那篇文章的评论中建议的那样。 - shanyu
这就是“赢家”的解决方案。只需要少量的胶水代码,您就再也不用担心了。您的应用程序中的任何地方都可以使用您自己的定制用户模型。 - T. Stone

1

我认为你问题的最快解决方案就是调用CustomUser.objects.get(user=user)(这是假设在你的CustomUser模型中user是一个属性)。我的建议是:

class CustomUser(models.Model):
    user = models.ForeignKey(User, unique=True)

所以当您获取CustomUsers的查询集时,您可以根据请求使用用户筛选器来过滤出您想要的用户。

否则,您可以修改中间件以包含CustomUsers而不是users,但我不确定具体如何实现 ;)

编辑:Mark告诉我他更喜欢使用继承,这样他就能使用User的所有自定义方法,这是有道理的,因此我找到了一篇文章来解决这个问题。

在这里


使用外键而不是Python继承的问题在于无法访问所有自定义方法。也许有一种方法可以查询它... - mpen
1
啊,我明白你在说什么了。我认为这个链接会提供你所需的准确信息!http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/ - shawnjan
是的,我正在尝试那个,但似乎它没有使用我的ModelBackend... 它仍然在使用默认的那个,即使我指定了 AUTHENTICATION_BACKENDS... - mpen
CustomUser.objects.get(user=request.user) 不起作用,但是 user = CustomUser.objects.get(pk=request.user.id) 似乎能解决问题。这不是最佳解决方案,但是无论如何 Django 和我都不太合得来,所以这没什么新鲜的... - mpen
真的吗,CustomUser.objects.get(user=request.user) 没有起作用吗...奇怪,我肯定在我的工作中使用了它。你的 CustomUser 有一个 user 字段吗? - shawnjan
不,它没有...我在我的问题中发布的模型是完整的(是的,只有2行)。 - mpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接