首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将request.user转换为代理auth.User类?

如何将request.user转换为代理auth.User类?
EN

Stack Overflow用户
提问于 2010-06-09 22:26:17
回答 2查看 3.2K关注 0票数 18

我有这个代理模型:

代码语言:javascript
复制
class OrderedUser(User):
    def __unicode__(self):
        return self.get_full_name()

    class Meta: 
        proxy=True
        ordering=["first_name", "last_name"]

我的一些其他模型使用OrderedUser而不是django.contrib.auth.models.User作为字段类型。

在我的视图中,我使用request.user填充一个字段,并如预期的那样得到一个错误:

代码语言:javascript
复制
'Cannot assign "<User...>": <field> must be a "OrderedUser" instance'

我可以只做OrderedUser.objects.get(request.user.id),但这对数据库来说是额外的打击。

那么,如何将基模型类转换为它的代理类呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-09 22:31:03

这是另一个数据库命中,但这将会起作用:

代码语言:javascript
复制
OrderedUser.objects.get(pk=request.user.pk)

编辑您可以尝试:

代码语言:javascript
复制
o = OrderedUser()
o.__dict__ = request.user.__dict__
票数 17
EN

Stack Overflow用户

发布于 2014-02-07 13:36:10

我无法让copy dict方法在Python 2.7.4和Django 1.6上工作。我没有一直跟踪它,但我认为这与它是一个懒惰的对象有关。

对我起作用的是:

代码语言:javascript
复制
request.user.__class__ = OrderedUser

它避免了数据库调用,并提供了对基本身份验证内容和所有扩展行为的访问。

为了使request.user始终像代理类一样工作,我将赋值放在中间件中,放在身份验证中间件之后,我的任何应用程序都可以引用它。由于每次请求都会调用中间件,因此在设置类之前,请确保对用户进行了身份验证。使用您的示例,下面是中间件代码可能的样子:

代码语言:javascript
复制
from yourapp.models import OrderedUser

class OrderedUserMiddleware():
    def process_request(self, request):
        if hasattr(request, 'user') and request.user.is_authenticated():
            request.user.__class__ = OrderedUser

并记住在认证后注册中间件:

代码语言:javascript
复制
MIDDLEWARE_CLASSES = [
    # ...middleware from the guts of Django, none of your middle wares yet...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # ...more middleware from the guts of Django, none of your middlewares yet...
    'yourapp.middleware.OrderedUserMiddleware',
    # ...more middleware from you other middlewares...
]
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3006753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档