我正在开发一个网站,其中许多网页不需要任何逻辑,并通过urls.py中的direct_to_template进行渲染,如下所示:
url('^support/slp/$',
direct_to_template, {
'template': 'pages_fixed/support/support_slp.html',
'extra_context': {
'questions': Question.objects.filter(show_slp=True).order_by('seq_num'),
'user_state': request.session['user_state'], # <-- tried adding, no go
}
},
name='support'
),
出现了一项新要求,要求我检查大多数这些页面中会话var的状态,以呈现模板的不同位。我尝试提供请求对象,但很明显,它在网址中不可用。
我知道我可以尝试为每个这样的页面(或者说,页面类别)创建一个新的“app”,然后在每个view.py视图函数中提供session var。然而,考虑到有多少页面,这似乎真的太过分了,我只需要这一个可用的var。
最简单(最轻量级)的解决方案是什么?
答案 0 :(得分:1)
关于您开始使用generic class based views的时间,它将自动传递请求上下文,这将使您的模板中的会话数据可用。
您必须启用模板request context processor,它会在模板级别为您提供{{ request }}
变量。
以下是使用ListView
的示例:
from django.conf.urls import patterns
from django.views.generic.list import ListView
urlpatterns = patterns('',
(r'^support/slp/$',
ListView.as_view(template_name="pages_fixed/support/support_slp.html",
queryset=Question.objects.filter(show_slp=True).order_by('seq_num')),
)
在您的support_slp.html
模板中,您将拥有一个object_list
变量,该变量将成为查询集的结果,您可以在模板中使用{{ request.session.user_state }}
。
答案 1 :(得分:0)
这可以在自定义模板标记中轻松完成。包含和赋值标记可以选择接受现有上下文,如果激活了请求上下文处理器,则包括请求。您可以使用它来访问会话。
答案 2 :(得分:0)
您可以使用自定义上下文处理器将所需内容提供给所有页面的上下文。假设您将此代码放在package_name / context_processors.py
中def session_data(request):
return {
'user_state': request.session['user_state'],
}
您在设置文件中的TEMPLATE_CONTEXT_PROCESSORS
中指定了此上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.request',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'package_name.context_processors.user_data')
有关上下文处理器的更多文档here