我的意思是,我有经典的永远存在的侧面板,我想显示一些模型数据(例如,现有帖子发布日期,标签等的年/月)。
由于这个侧面板始终存在,我还想避免将检索逻辑放在我定义的每个视图中,因为它是重复的,容易出错/容错,不太可维护等等。
在django中有没有办法定义这样的逻辑并在我做的每个视图中绑定/注入它的结果?
更好的是直接在模板中执行此操作以将其与视图完全分离,因此如果我有一个不需要数据的不同页面(如登录/退出页面),django赢了&浪费工作/时间来检索/操纵甚至无法显示的东西。
提前致谢
答案 0 :(得分:2)
CONTEXT_PROCESSORS
中提供的上下文处理器将在该设置文件支持的每个模板中可用,以创建一个:
context_processors.py
settings.py
在里面,创建一个函数,就像一个带有参数request
的视图,并且应该返回一个字典
def function_name(request):
variable = 'Hello World'
# all stuff that you want to make available
return {'variable':variable}
转到settings.py
,添加context_processors.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'project_name.context_processors.function_name',
],
},
},
]
现在可以使用sesttings.py
文件提供的所有模板
<p>here is the {{ variable }}</p>
答案 1 :(得分:0)
这里有两种选择。你可以设计一个混合,你可以在你的类声明中包含,并在那里扩展get_context_data
,如下所示:
class SidebarMixin():
def get_context_data(self, **kwargs):
context = super(SidebarMixin, self).get_context_data(**kwargs)
context['sidebar'] = mycontext #insert here your stuff
class MyView(View, SidebarMixin):
def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
context['mycontext'] = mycontext #insert here your stuff
否则您可以定义新的模板标签:
@register.inclusion_tag('sidebar.html', takes_context=True)
def sidebar(context):
return {
'sidebar': mysidebar_context,
}