Django:模板上下文处理器请求变量

0 投票
2 回答
1492 浏览
提问于 2025-04-15 19:19

我正在尝试实现一个叫做 django-facebookconnect 的功能,因为我需要检查用户是通过 Facebook 登录的,还是普通用户。

在模板中,我可以通过检查 request.facebook.uid 来判断用户是否是通过 Facebook 登录的,比如:

{% if is_facebook %}
{% show_facebook_photo user %}
{% endif %}

为此,我需要把 is_facebook': request.facebook.uid 传递给模板。因为我会在很多地方用到这个,所以我想把它应用到一个现有的模板上下文处理器中,并在 base.html 中调用上面的代码片段,这样对 Foo 对象来说是可以正常工作的:

def global_variables(request):
    from django.conf import settings
    from myproject.myapp.models import Foo
    return {'is_facebook': request.facebook.uid,'foo_list': Foo.objects.all()}

我可以在任何视图中列出 Foo 对象,没有问题。但是对于这个新的 is_facebook,它就不行了,直接什么都不返回。

如果我在每个视图中都传递 'is_facebook': request.facebook.uid,那是可以的,但我希望这个功能在任何视图渲染时都能全局使用。

2 个回答

0

这可能是个时间顺序的问题。确保在你的设置文件中,通用的中间件要放在 Facebook 中间件之前。你可以试着调试一下,看看 Facebook 中间件是什么时候在修改请求的,以及你的上下文处理器是什么时候被调用的。这样可能会给你一些线索,帮助你理解为什么会出现这个问题。不过,正如丹尼尔所说,你也可以直接在模板中使用请求对象。

1

如果你已经可以通过 request 对象访问数据,那为什么还需要添加一个特别的 is_facebook 布尔值呢?其实,只要启用内置的 django.core.context_processors.request,这样就能确保 request 在所有模板中都能使用。然后你就可以这样做:

{% if request.facebook.uid %}

撰写回答