在if条件满足3次后,如何使for product in products环路断开.我一直在try 设置一个计数器,但这不起作用...因为set在for循环内不被接受.尽管对它进行了更多的测试,但它在任何地方都不被接受.

当我使用set时,它抛出这个异常或其变体:Invalid block tag on line 11: 'set', expected 'endblock'. Did you forget to register or load this tag?

我知道我应该把我正在使用的模板的所有逻辑放在视图内部,然后通过字典传递它,但研究这方面的所有内容需要花费太多时间,我只想完成这项工作.

老实说,我真的很累,现在是早上6点,我不知道该怎么办.提前感谢您的帮助.:)

编辑:我知道我必须使用namespace()使set能够跨作用域传播.但set本身仍引发了与上述相同的例外.

Edit2:我认为django使用jinja2作为模板语言,但事实似乎并非如此.我修复了提到jinja2的问题,因为我没有改变新安装的django附带的任何默认设置.

HTML

{% for category in categories %}
    <div>
        <h5 class="text-line"><a href="" class="store-category"><span>{{category.name}}</span></a></h5>
    </div>
        <!-- Cards Container -->
        <div class="shop-cards">
        {% set counter = 0 %}
        {% for product in products %}
            {% if product.category.categoryID == category.categoryID %}
                <!-- CARD 1 -->
                <div class="card">
                    <image class="product-image" src="{% static 'images/product-4.png' %}"></image>

                    <div class="card-category-price">
                        <h3 class="product-name">{{product.name}}</h3>
                        <h3 class="product-price">{{product.price}}</h3>
                    </div>
                </div>
            {% endif %}
        {% endfor %}  
        </div>
{% endfor %}

推荐答案

你(故意)做不到.Django在设计上固执己见,模板语言用于显示而不是逻辑.

你可以用金贾来代替.

或者,您可以使用Python完成复杂的工作,并通过上下文将结果提供给模板语言.请记住,在Python中将任意对象附加到列表中是一种廉价的操作.所以(在CBV中)类似于

context['first_three'] = self.get_first_three( whatever)
...

def get_first_three(self, whatever):
    first_three = []

    for obj in  ...:
        if complicated stuff ...
            first_three.append( obj)
            if len(first_three) == 3:
                break

     return first_three

顺便说一句,你不能(轻松地?)实现break-in Django模板,但您可以轻松地为其提供计数功能:

class Counter( object):
    def __init__(self):
       self.n = 0
    def value(self):
       return self.n
    def incr(self):
       self.n += 1
       return ''

在上下文中传递context['counter'] = Counter()

在模板中,尽可能多地引用{{counter.value}},在要计算发生次数的条件中,使用{{counter.incr}}.但是,这是黑客行为,可能是最好避免的.

Django相关问答推荐

在生成的表单元素处出现多值DictKeyError

如何在Django查询集中查询多对多字段内是否存在实例

Django-admin 显示decorator 按多列排序

如何使更新记录在 Django 模型中传递信号?

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

在 Django 4.1 中提交表单之前显示数据

在 PyCharm 中运行 Django 测试

将 **kwargs 传递给 Django 表单

根据模型属性获取django对象id

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

UnicodeDecodeError:asciicodec can't decode byte 0xe0 in position 0: ordinal not in range(128)

django 表单为关键字参数获取了多个值

Celery 和 Django 简单示例

有日期时间±无穷大吗?

如何在 Django 中触发 500 错误?

获取 django 应用的绝对路径

基于 User-Agent 更改 Django 模板

ModelForm 上的 Django 和字段集

Django - 保存新对象时如何获取 self.id?

如何在 django 模板中呈现有序字典?