我即将开始一个新项目,我想这次django是要走的路。我一直在阅读过去两周的文档,看起来很有希望。
好吧,问题是我找不到任何关于(在C#MVC中调用)Partial Rendering的内容。例如,如果我想要一个菜单项来自数据库的动态菜单,那么我希望基本模板(或母版页)在每个请求上呈现菜单(部分渲染器调用另一个操作或渲染模板会话数据)。因此,只要我的模板继承自此基本模板,菜单就是免费的。
老实说,我不知道如何实现这一目标。
我想要的是基本模板中的一些代码,它们使用子模板中未包含的数据。每次调用render_to_response('child_content.html',context)时,我都不想包含额外的变量(可能是'menu_list_items')。这可能吗?
谢谢!
答案 0 :(得分:6)
您可以使用context processor或custom template tag来提供此功能。
context_processor是一个简单的函数,可以向每个RequestContext添加对象。自定义模板标记可以有自己的模板片段和上下文,可以为您呈现菜单。
答案 1 :(得分:0)
对于模板重用:您应该只为通用布局创建基本模板,并为各个页面使用详细模板。 Django documentation已详细介绍了这一点。
我倾向于为那些通用部件(例如,突出显示当前使用的网站部分的菜单)做的是创建我自己的render_to_response
函数,类似于以下内容: / p>
from django.shortcuts import render_to_response as django_render_to_response
def render_to_response(template, params, context_instance):
return django_render_to_response(template,
AppendStandardParams(request, params),
context_instance)
ApplyStandardParams
方法然后根据当前路径配置菜单:
def AppendStandardParams(request, params):
if request.META['PATH_INFO'].startswith('/customer'):
params['category'] = 'customer'
params['title'] = 'Customer overview'
# and so on for all different parts
此示例中的这些category
和title
标记是用于突出显示菜单,配置标题等的一些值。例如:
<!-- Customer menu entry: change class if this is the current category. -->
<li{% if category == "customer" %} class="selected"{% endif %}>Customers</li>
最后,要在视图中使用它,而不是正常的render_to_response
导入,我只需执行from lib.views import *
之类的操作,这样我的自定义版本就可以在视图中使用了。这样,视图中所有代码的语法保持不变,但每次创建新视图或应用程序时,我都不必自定义菜单。