2016-08-11 17 views
0

在從詞典中檢索值迭代我有一個映射目標查詢上下文字典項objectives反對屬於該目標的測試列表。示例代碼:「的」報表應使用「在Y X」的格式:同時使用Django模板

objectives = Objective.objects.filter(requirement=requirement) 
context_dict["requirements"][requirement] = objectives 
for objective in objectives: 
    tests = Test.objects.filter(objective=objective) 
    context_dict["objectives"][objective] = tests 

在我的django html模板中,我遍歷目標並顯示它們。然後我想迭代屬於這些目標的測試。當我這樣做:

{% for test in {{ objectives|get_item:objective }} %} 

我得到一個TemplateSyntaxError: 'for' statements should use the format 'for x in y':

在應用/ templatetags目錄,我有:

from django.template.defaulttags import register 
... 
@register.filter 
def get_item(dictionary, key): 
    return dictionary.get(key) 

相反,如果我做{{ objectives|get_item:objective }}一個JS變量,我看到它確實產生了一個列表,我應該能夠迭代。當然,我不能混用JS變量和Django模板標籤,所以這是僅用於調試:

var tests = {{ objectives|get_item:objective }} 

var tests = [<Test: AT399_8_1>, <Test: AT399_8_2>, <Test: AT399_8_3>, <Test: AT399_8_4>, <Test: AT399_8_5> '...(remaining elements truncated)...'] 

如何遍歷這個列表中的Django模板標籤?

+0

問題是你不能在{%...%}標籤裏面使用{{...}}語法。用等效的Python代碼替換「{{targets | get_item:objective}}」。 – Bakuriu

+0

@Bakuriu你不能做內部'{%...%}'標籤的字典訪問,但​​ - 相當於Python代碼是'目標[目的]',這是行不通的。 –

+0

@JeremyWeirich字典在django模板中的訪問使用'''運算符。 '{{dictionary.key}}'輸出值,但它不適用於你,因爲密鑰不能是一個變量 –

回答

2

您可以將{%...%}

內沒有用戶{{...}}什麼,你可以嘗試是改變你的過濾器來分配標籤,並使用該值在循環

@register.assignment_tag 
def get_item(dictionary, key): 
    return dictionary.get(key) 

,然後在模板中使用它作爲

{% get_item objectives objective as tests %} 
{% for test in test %} 
    .... 
{% endfor %} 

而不是所有這些,如果你的模型適合於外鍵我會做類似

{% for objective in requirement.objective_set.all %} 
    {% for test in objective.test_set.all %} 
     .... 
    {% endfor %} 
{% endfor %} 

在我的方面,我僅傳遞requirement

+0

這是有效的。閱讀更多[這裏](https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/#assignment-tags)。 –

+0

關於你的編輯:'objective_set.all'什麼也沒有返回,但我認爲這是因爲我把外鍵與父母聯繫起來,而不是關係到孩子。那是不正確的? –

+1

如果模型中有一個字段'要求= model.ForeignKey(要求)'會創建一個與您設置爲'related_name'的modelname_set或任何反向關係。然後,您可以使用反向關係進行查找。 https://docs.djangoproject。com/en/dev/topics/db/examples/one_to_one/for more reading –

0

你已經有一個答案,但要注意,丟棄{{ }}標籤,並保持一切一樣會工作得很好。

{% for test in objectives|get_item:objective %}