我有以下代码:
# main.html
<div class="ingest">
{% includes "checklist.html" with is_ingest=1 %}
</div>
<div class="master">
{% includes "checklist.html" with is_master=1 %}
</div>
-
# checklist.html
{% if is_ingest %}
{% for option in checklist_options %}
{% if option.is_ingest %}
do something
{% endif %}
{% endfor %}
{% endif %}
{% if is_master %}
{% for option in checklist_options %}
{% if option.is_master %}
do something
{% endif %}
{% endfor %}
{% endif %}
有没有办法简化代码,所以我可以传递一个变量:
{% for option in checklist_options %}
{% if option.*VARIABLE* %}
do something
{% endif %}
{% endfor %}
我怎么这样做,所以我不必多次重复我的自我? (在实际代码中我必须重复上述模式5次。)
答案 0 :(得分:1)
嗯,我认为你可以在视角解决它。我不知道你的看法,但我举了一个例子:
def checklist_options(request):
# I dont know how you get your query
checklist_options = CheckOption.objects.all()
#I dont know where it comes from
is_master = True
if is_master:
masters_checklist_options = checklist_options.filter(is_master=True)
#I dont know where it comes from
is_ingest = True
if is_ingest:
ingest_checklist_options = checklist_options.filter(is_ingest=True)
return render(request, ' main.html', {
"masters_checklist_options": masters_checklist_options
"ingest_checklist_options": ingest_checklist_options
},)
所以,你的main.html可以是:
<div class="ingest">
{% includes "checklist.html" with collection=ingest_checklist_options %}
</div>
<div class="master">
{% includes "checklist.html" with collection=master_checklist_options %}
</div>
和checklist.html:
{% for option in collection %}
do something
{% endfor %}
你赢了什么?
您可以在视图中登录(可能在模型中)。
作为示例,当您致电{% if option.is_master %}
时,可以避免n + 1问题。
因为在check_list.html的每次呈现中,您已经有过滤器is_master
或is_ingest
选项。
我希望你不理解我的观点,我已经猜到了你的模特并给你一个傻瓜视图的例子。 如果您需要帮助,请告诉我们您的观点和模型,我将能够为您提供更多帮助。
希望帮助