0

我正在开发一个项目,其中一些模板作为“主题”的一部分存储在数据库中。正因为如此,我无法立即利用 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 中需要用户定义的模板时,他们通常会做什么?

4

1 回答 1

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,但如果您想在循环上下文中包含某些内容,您仍然会遇到问题。

有点笨拙,不完全是您正在寻找的东西,但它会起作用。

于 2012-11-15T20:08:44.473 回答