【问题标题】:Getting Proxied user object in django templates在 django 模板中获取代理用户对象
【发布时间】:2015-11-04 13:17:22
【问题描述】:

我有MyUser 作为代理User 模型。

型号

class MyUser(User):
    class Meta:
        proxy = True
        ordering = ['username']
    @property
        def keywords(self):
            return u','.join(self.get_full_name().split())

我正在按如下方式呈现我的 html。

观看次数

return render_to_response('new/view_image.html', context_instance=RequestContext(request, ctx))

设置.py

​​>
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.messages.context_processors.messages',
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.request',
    'django.core.context_processors.media',
)

在模板中,当我调用{{ user }} 时,我得到User 对象,我可以调用所有方法,例如user.is_authenticated 等。

但问题是我在代理模型中定义了一些属性,我想在访问用户对象时使用这些属性。 我的意思是我需要{{ user }} 成为MyUser 的一个实例。

如果您没有跟进,请告诉我。 干杯。

【问题讨论】:

    标签: python django proxy django-authentication


    【解决方案1】:

    我建议您不要将request.user 转为您的代理实例,因为Django 内部可能期望它是User 模型的实例。

    您可以做的是向User 模型添加属性,您将通过它访问您的代理实例。

    例如

    class MyUser(User):
    
        class Meta:
            proxy = True
    
        @property
        def keywords(self):
            return u','.join(self.get_full_name().split())
    
    
    
    def proxy_access_fn(self):
        return MyUser.objects.get(id=self.id)
    
    
    setattr(User, 'my_proxy', property(proxy_access_fn))
    

    然后在模板中你会像这样访问它:

    {{ user.my_proxy.keywords }}
    

    我确信有办法在不访问数据库的情况下将模型实例转换为代理模型实例,但这个实现只是为了展示这个想法。

    【讨论】:

    • proxy_access_fn 是 MyUser 类的一部分吗?
    • 不。它是独立的功能。
    • 哥们,你在 proxy_access_fn 中使用self
    • 是的。表示它将作为属性或类实例上的绑定方法工作。在将其设置为 Usersetattr 之后,它的行为就是这样。
    • 太棒了,速度快,干净,而且能胜任。 +1 伙计。
    猜你喜欢
    • 2015-10-31
    • 2021-01-09
    • 1970-01-01
    • 2015-03-24
    • 2010-10-20
    • 2012-11-22
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多