簡體   English   中英

動態創建模板/動態

[英]create templates on the fly / dynamically

我目前正在圍繞一個相當復雜的數據模型編寫一個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()”來監聽嵌套的元組。

包含標簽怎么樣?

@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傳遞給主模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM