在参数上传递的加载基础模板

时间:2010-04-21 14:23:28

标签: django dynamic templates

我有一个网站,其中列出了不同的项目/程序,该列表是动态的,因此一旦用户点击特定程序,例如/ program / health模板应该加载一个具有“健康”特定标题(桅杆头)的模板。如何根据所选程序加载基本模板?

3 个答案:

答案 0 :(得分:0)

您是否考虑过使用模板变量中的CSS类名组合并包含模板标记来实现此目的?

类似的东西:

<body class="{{ program }}">
    <div>{% include program_specific_template %}</div>
    <div>Common stuff...</div>
</body>

答案 1 :(得分:0)

每当您将模板的路径传递给函数时,您可以将硬编码的字符串替换为您选择的某个变量。如果你这样做,那么确保它是一个明智的价值是极端重要。公平地说,模板系统将逃避危险的东西并且不会超出指定的模板目录,但是尝试加载不存在的模板会导致视图崩溃而你不希望这样。

如果您有该程序的模型,那么获取模型并使用slug作为模板名称,如下所示:

p = get_object_or_404(Program, slug = slug_from_url_or_whatever)
template = "program_%s.html" % p.slug

也可以将模板列表传递给加载器。如果找不到第一个,它将尝试下一个,等等。例如:

render_to_response([template, "default_program_template.html"], ...)

答案 2 :(得分:0)

您当然可以使用custom Context Processor和一些CSS来完成工作。

<强> settings.py

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"yourproject.context_processors.header_context")

<强> context_processors.py

def header_context(request):
    values = {'body_class': "default",}
    if request.path == "/program/health/":
        ## Don't really use an if block, it's just nasty.
        values['body_class'] = "health"
    return values

<强> views.py

from django.shortcuts import render_to_response
from django.template import RequestContext
def view(request):
    ## Do magic stuff!
    return render_to_response("template.html",
               {},                         
               context_instance=RequestContext(request))

<强> template.html

<body class="{{ body_class }}">
    <!-- Whatever -->
</body>