在 Django 模板中获取代理用户对象

Getting Proxied user object in django templates

我有 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))

settings.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.

的实例

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

我建议您不要将 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 }}

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