2013-07-24 107 views
3

我需要創建一個自定義標籤返回一個列表,然後我可以通過{% for item in custom_tag_returning_list %}自定義django標籤返回列表?

現在我已經使用* assign_tag *方法做了下面的技巧,但懷疑這是正確的方式:

from django import template 
from product.models import Product 

register = template.Library() 

@register.assignment_tag 
def all_products(): 
    return Product.objects.all().order_by('name') 

在模板我上無法直接使用all_products但需要分配給一些變量第一個:

{% all_products as all_products_list %} 
{% if all_products_list %} 
    {% for product in all_products_list %} 
    ... 
    {% endfor %} 
{% endif %} 

是否需要對臨時變量進行賦值?不能直接與其他標籤助手一起使用?

+0

爲什麼你不能發送這個在視圖的上下文? – karthikr

+0

你認爲這是什麼錯誤?這正是分配標籤的用途。根本不是黑客。 –

+0

你可以用一個普通的標籤和一個'{%empty%}'標籤來做到這一點,但是就像丹尼爾說的那樣,這對我來說看起來很好。 –

回答

3

這對我來說看起來很好。

另外,由於某些原因,如果您無法通過視圖的上下文通過product_list,如果你覺得這是你可以使用一個inclusion tag清潔:

@register.inclusion_tag("tags/products_list.html") 
def all_products(): 
    return {'products_list': Product.objects.order_by('name') } 

products_list.html

{% for product in products_list %} 
    ......... 
{% empty %} 
    Empty list 
{% endfor %} 

和在html文件中,你只需要做

{% all_products %} 
+0

根據您返回的字典,認爲您的意思是「{product for product_list%中的產品%}」。 –

+0

感謝您的替代方式,可能是一個更清潔的解決方案。 – Torimus