【发布时间】: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 的回答中提供一个例子,你可以领取你的奖品:)