【问题标题】:How can I include sub-templates in a dynamically created template?如何在动态创建的模板中包含子模板?
【发布时间】:2012-11-03 08:45:55
【问题描述】:

我正在做一个项目,其中一些模板作为“主题”的一部分存储在数据库中。正因为如此,我无法立即利用 Django 的大量模板渲染功能。例如:

# Instead of this...
return render_to_response('path/to/template', arguments, context_instance=context)

# Have to do this...
template = Template(model.template_field)
context.update(arguments)
return HttpResponse(template.render(context))

这很好,但是我遇到的问题是包含子模板。例如,如果model.template_field 看起来像这样......

<html>
    <head>
        {% include head_extra %} <!-- Another DB field -->
    </head>
    <body>
        {% include body_extra %} <!-- Another DB field -->
    </body>
 </html>

...然后Django会抱怨模板不存在(因为没有那个名字的模板)。

如何在动态创建的模板中包含子模板?

编辑(忽略数据库约束,并提供更多详细信息):
我希望用户能够通过文件上传或某些编辑器来定义自己的模板。

我希望他们能够通过{% include %} 包含子模板,但我不希望用户担心他们来自哪里。因此,我只希望他们像这样包含:{% include extra_head %}。但是,django 肯定需要知道模板的位置才能加载它们。

当人们在 django 中需要用户定义的模板时,他们通常会做什么?

【问题讨论】:

  • 这不是一个常见的场景 - 我建议编写一个模板标签,例如传递数据库中记录的 id 或任何你需要找出匹配的 sn-p 的东西。
  • 嗯......这也不太理想。我正在努力让客户轻松创建自己的模板。
  • 那么你想要实现什么?如果你不知道渲染的部分,因为它来自数据库,你必须自己处理它。如果例如头部总是被称为“head_extra”,写一个模板标签,如 {% include_from_db request.user "head_extra %} 它为给定用户返回渲染的“head_extra”。或者我错过了什么?
  • 切换到 Jinja2 并覆盖 baseloader 类以从数据库加载。 Jinja2 比 Django 模板更容易使用。
  • 如果你可以在@PauloScardine 的回答中提供一个例子,你可以领取你的奖品:)

标签: django django-templates


【解决方案1】:

如果您愿意放弃需要{% include %} 语句的要求,如果您在视图中尝试类似的操作,则可以手动执行...

def view(request, id):
    theme = get_object_or_404(Theme, pk=id)
    original_context = RequestContext(request)

    page_context = Context({
        'db_head': Template(theme.head_template).render(original_context),
        'db_body': Template(theme.body_template).render(original_context)
    }

    page = Template(theme.page_template)
    return HttpResponse(page.render(page_context))

...使用这样的“模板”:

<html>
    <head>
        {{ db_head }}
    </head>
    <body>
        {{ db_body }}
    </body>
</html>

这种模式也适用于嵌套更深的元素,前提是您首先构建了最低级别的模板。您可以通过render_to_string 包含现有模板,但如果您想在循环上下文中包含某些内容,您仍然会遇到问题。

有点笨拙,并不完全符合您的要求,但它会起作用。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多