Django模板按模型字段动态过滤

时间:2013-12-20 23:00:47

标签: django django-templates

我有以下代码:

# 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次。)

1 个答案:

答案 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_masteris_ingest选项。

我希望你不理解我的观点,我已经猜到了你的模特并给你一个傻瓜视图的例子。 如果您需要帮助,请告诉我们您的观点和模型,我将能够为您提供更多帮助。

希望帮助