我目前正在围绕一个相当复杂的数据模型编写一个django应用程序。对于许多用例,我需要构建类似但略有不同的模板(包括图形可视化等)。
现在我想知道是否有办法遵循 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传递给主模板。