【问题标题】:Custom django tag returning a list?自定义 django 标签返回列表?
【发布时间】:2013-07-24 02:54:50
【问题描述】:

我需要创建一个自定义标签,返回一个列表,然后我可以使用 {% for item in custom_tag_returning_list %} 遍历。

现在我使用 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 %}

是否需要对临时变量进行赋值?不能直接和其他一些标签助手一起使用吗?

【问题讨论】:

  • 为什么不能在视图的上下文中发送这个?
  • 您认为这有什么问题?这正是分配标签的用途。根本不是黑客。
  • 您可以使用常规标签和{% empty %} 标签来做到这一点,但正如丹尼尔所说,这对我来说看起来不错。
  • @karthikr 可能可以,但是否有一些可用于所有模板的基本/一般视图?抱歉,我是 Django 的新手。
  • @DanielRoseman 只是询问是否需要分配一些不需要的变量,感觉像是一种解决方法。

标签: python django


【解决方案1】:

常见的方法是在视图上下文中简单地从控制器传递all_products

【讨论】:

    【解决方案2】:

    这对我来说看起来非常好。

    或者,由于某种原因,如果您无法通过视图的上下文传递 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 %}
    

    【讨论】:

    • 根据您返回的字典,您的意思是 {% for product in product_list %}
    • 感谢您的替代方式,可能是更清洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2012-07-07
    • 2014-09-14
    • 2012-05-07
    • 2016-09-20
    • 2010-10-10
    • 2011-07-11
    相关资源
    最近更新 更多