我正在开发一个项目,其中一些模板作为数据库中“主题”的一部分存储。因此,我无法立即利用很多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中想要用户定义的模板时通常会做什么?
答案 0 :(得分: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
包含现有模板,但如果您想在循环上下文中包含某些内容,仍会遇到问题。
有点笨拙,并不完全是你想要的,但它会起作用。