Django:模板上下文处理器请求变量
我正在尝试实现一个叫做 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 %}