动态创建模板/动态

时间:2013-09-22 00:26:23

标签: python django django-templates dry

我目前正在围绕一个相当复杂的数据模型编写一个django应用程序。 对于许多用例,我需要构建类似但略有不同的模板(包括graphviz等)。

现在我想知道是否有办法跟随DRY并“动态”创建模板,例如基于嵌套元组(每个用例定义一个 - >模板)。

实际上我想停止写这些:

static_template_case1.html

{% if program %}
    {{ program.name }}
    {% for process in program.process_set.all %}
        {{ process.name }}
        {% for step in process.step_set.all %}
            {{ step.name }}
        {% endfor %}
        {% for control in process.control_set.all %}
            {{ control.name }}
        {% endfor %}
    {% endfor %}
{% endif %}

并将其替换为以下方向:

template_generator.py

structure_case1 = ("program"("process"("step","control")))

def onTheFlyTemplate(structure):
    # iterate through structure
    # build template dynamically
    # return template

onTheFlyTemplate(structure_case1)

我无法找到类似的东西,也不知道从哪里开始生成模板,也不知道如何集成它。

在视图中感觉是一个很好的起点,(而不是loader.get_template('static_template_case1.html'))。

感谢任何暗示让我走向正确的方向以及你的想法,如果DRY在这里“过度”。

拉​​尔夫

修改

我向前迈进了一步,做了以下事情:

在视图中:

from django.template import Template
def templateGen():
    return Template("Program: {{program.count}}") 

@login_required
def test(request):
    program = Program.objects.all()
    t = templateGen()
    c = RequestContext(request,locals())
    return HttpResponse(t.render(c))

到目前为止,这只是一个概念证明。真正的工作是编写一个智能的“templateGen()”来监听嵌套的元组。

1 个答案:

答案 0 :(得分:1)

包含标签怎么样?

@register.inclusion_tag('<your-template.html>')
    def get_program(program_id):
        return {'program': <some logic to return your Program object>}

您的主要模板:

{%load my-template-tags%}

<div id="my-div">
     {%get_program program_id %}
</div>

您的模板文件:

{{ program.name }}
{% for process in program.process_set.all %}
    {{ process.name }}
    {% for step in process.step_set.all %}
        {{ step.name }}
    {% endfor %}
    {% for control in process.control_set.all %}
        {{ control.name }}
    {% endfor %}
{% endfor %}

您必须将program_id传递到主模板。