如何让Django模板中的for循环在达到计数器时中断?

7 浏览
0 Comments

如何让Django模板中的for循环在达到计数器时中断?

如何在满足 if 条件 3 次后使 for product in products 循环中断。我一直在尝试设置一个计数器,但这并不起作用...因为 set 在 for 循环内部是不被接受的。不过,经过进一步测试,它在任何地方都不被接受。\n当我使用 set 时,它会抛出这个异常或其变种:Invalid block tag on line 11: \'set\', expected \'endblock\'. Did you forget to register or load this tag?\n我知道我应该将所有我要在模板中使用的逻辑放在视图中,然后通过字典传递它,但是要研究有关那方面的一切将需要太多时间,我只想快点完成这个。\n老实说,我真的很累,现在已经是早上6点了,我不知道该怎么办。提前感谢你的帮助。:)\n编辑:我知道我必须使用 namespace() 使 set 能够在范围内传播。但是 set 本身仍然引发与上述相同的异常。\n编辑2:我以为 Django 使用的是 jinja2 作为其模板语言,但似乎事实并非如此。我修复了关于 jinja2 的提及,因为我没有改变 Django 新安装的默认设置。\nHTML\n

{% for category in categories %}
        
{{category.name}}
{% set counter = 0 %} {% for product in products %} {% if product.category.categoryID == category.categoryID %}

{{product.name}}

{{product.price}}

{% endif %} {% endfor %} {% endfor %}

0
0 Comments

问题的原因是对模板功能的错误理解。模板主要用于显示目的,而不是用于过滤目的,而您面临的是一个过滤问题:我想要过滤满足特定条件的列表的前三个元素,这是您的主要问题,而模板框架在解决您的问题上效果较差,而这正是Python和Django的ORM擅长的领域。

为什么不先在Django中进行过滤,然后在模板中显示呢?例如:

...
products = queryset.filter(abc=condition)[:3]
context = Context({ 'products': products }) 
return HttpResponse(template.render(context))

是的,我理解这不是它应该工作的方式。但这似乎是最简单的解决方案。老实说,我对视图如何与模板真正交互并不了解...所以我一直在回避它。不过...我可能需要创建一个矩阵而不是一个列表。因为每个for category in categories循环的三个必须传递的产品是与类别相关的。我不认为您能够从模板返回数据给视图函数。

0
0 Comments

问题的原因是Django模板语言的设计意图是用于显示而不是逻辑操作,因此无法在模板中直接使用for循环中的计数器来实现break功能。解决方法有两种:一种是使用Jinja模板语言替代Django模板语言;另一种是在Python中处理复杂的逻辑操作,然后将结果通过上下文传递给模板语言使用。

对于第二种解决方法,可以通过在视图中定义一个Counter类来实现计数器功能。Counter类中有value()方法返回计数器的值,incr()方法用于增加计数器的值。在视图中将Counter实例添加到上下文中,然后在模板中通过{{counter.value}}来获取计数器的值,在需要计数的条件语句中使用{{counter.incr}}来增加计数器的值。

虽然这种方法有些hacky,但可以实现计数的功能。类的声明可以放在项目中任何合适的位置,并且可以通过导入来重复使用。完成以上操作后,可以在模板中使用if语句来判断计数器的值,从而实现类似于break的功能。

文章完。

0