2013-12-20 63 views
1

我有以下代碼:Django的模板動態過濾通過示範田

# 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

我認爲你應該在視圖方面解決它。請給我看一個你的觀點和模型的例子。也許你可以進行一些查詢,避免避免一些'if's。 – lalo

回答

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選項。

我希望你明白我的觀點,我已經猜出你的模特,並給你一個傻瓜視圖的例子。 如果您需要幫助,請向我們展示您的視圖和模型,我將能夠爲您提供更多幫助。

希望有幫助