如何使用django在基本模板中制作动态菜单

时间:2011-10-26 05:35:22

标签: django django-templates renderpartial

我即将开始一个新项目,我想这次django是要走的路。我一直在阅读过去两周的文档,看起来很有希望。

好吧,问题是我找不到任何关于(在C#MVC中调用)Partial Rendering的内容。例如,如果我想要一个菜单​​项来自数据库的动态菜单,那么我希望基本模板(或母版页)在每个请求上呈现菜单(部分渲染器调用另一个操作或渲染模板会话数据)。因此,只要我的模板继承自此基本模板,菜单就是免费的。

老实说,我不知道如何实现这一目标。


我想要的是基本模板中的一些代码,它们使用子模板中未包含的数据。每次调用render_to_response('child_content.html',context)时,我都不想包含额外的变量(可能是'menu_list_items')。这可能吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

您可以使用context processorcustom 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

此示例中的这些categorytitle标记是用于突出显示菜单,配置标题等的一些值。例如:

<!-- 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 *之类的操作,这样我的自定义版本就可以在视图中使用了。这样,视图中所有代码的语法保持不变,但每次创建新视图或应用程序时,我都不必自定义菜单。