我在Django中编写一个自定义标记,它应该输出存储在用户会话中的值,但是我找不到从自定义标记函数中访问会话对象的方法。有没有办法做到这一点,没有手动将会话对象分配给上下文变量?
答案 0 :(得分:23)
您应该能够在settings.py文件中添加请求上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',)
这将与当前答案完全相同,无需添加自定义文件。
答案 1 :(得分:6)
没有任何冒犯意图塞巴斯蒂安认为它在某一点上似乎是一个有用的黑客,但奇怪的是在12月24日博客条目中关于访问管理员中的用户数据,詹姆斯贝内特,Django的发布经理,有这样说{ {3}}:
一个很大的免责声明:这些类型的功能有很多很多潜在的用途。他们中的许多人是错的和愚蠢的,你不应该尝试他们。 ...此外,您偶尔会看到有人建议这些功能可以通过所谓的“threadlocal hack”获得;这基本上涉及将request.user粘贴到一种神奇的全局可用变量中,如果你不知道你在做什么,那就是非常糟糕的事情。即使你确实知道自己在做什么,这通常也是一件非常糟糕的事情,因为你可能只是在做这件事,因为你很懒,并且不想确保你正确传递信息。因此,如果您看到有人建议您使用“threadlocal”执行此操作,请忽略该人。
不是说你应该忽略塞巴斯蒂安,但是可能值得追求其他途径,而不是使用不被认为是最佳实践的threadlocal。
答案 2 :(得分:4)
您可以使用自定义上下文处理器执行此操作(请参阅http://docs.djangoproject.com/en/dev/ref/templates/api/)
在这种情况下,您将创建一个名为context_processors.py的新文件,其级别与settings.py文件相同,包含:
def add_session(request):
return {'session': request.session}
然后,在您的settings.py文件中,添加:
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'context_processors.add_session',)
您现在可以在自定义标记中引用上下文['会话']。
请注意,这仅适用于使用分配的RequestContext呈现的模板,如以下代码所示:
def test(request):
return render_to_response('test.html',{}, context_instance=RequestContext(request))
答案 3 :(得分:0)
我觉得这很有用:http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
您可以使用中间件获取用户信息并使用本地线程存储它,然后将其与您的标记定义一起使用。
答案 4 :(得分:0)
使用来自django-annoying的render_to装饰器似乎是最佳选择(如another question on stackoverflow中所示)