块标记中不允许使用Django break语句

xjreopfe  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(98)

错误信息:“django.template.exceptions.TemplateSyntaxError:第82行上的块标记无效:“break”,应为“elif”、“else”或“endif”。您是否忘记注册或加载此标签?“
这个错误是因为我试图在Django模板的块标记中使用break语句。
为了修复这个错误,我将其替换为block标记中的return语句。这将立即终止if语句。但错误仍然是一样的。
下面是代码:

<div class="card">
                <h5 class="mb-30">By Categories</h5>
                <div class="categories-dropdown-wrap font-heading">
                  <ul>
                    {% for c in categories %}
                      <li>
                        <input
                          data-filter="category"
                          class="form-check-input filter-checkbox"
                          type="checkbox"
                          name="checkbox"
                          id="exampleCheckbox2"
                          value="{{ c.id }}"
                        />
                        &nbsp;&nbsp;
                        <a href="{% url 'core:category-product-list' c.cid %}">
                          <img src="{{c.image.url}}" alt="" />{{ c.title }}</a
                        >
                      </li>
                      {% if c.loop.index == 5 %}
                        <li>
                          <p>This is the 5th category.</p>
                        </li>
                        {% break %}
                      {% endif %}
                    {% endfor %}
                  </ul>
                </div>
              </div>

我的目标是停止循环后,上市5个项目的类别,请我需要帮助来解决这个问题

zujrkrfu

zujrkrfu1#

@Tarquinius谢谢,老板,我找到了另一种方法来解决它,使用 slice 来限制我的迭代次数,然后从views.py中修剪添加到上下文中的条目数量。我用这个返回列表的一部分,我可以将它限制在几个地方,而不是整个函数,例如侧边栏上的类别列表现在只能有5个项目,而类别列表页面有完整的列表。
下面是更新后的代码:

<div class="card">
                <h5 class="mb-30">By Categories</h5>
                <div class="categories-dropdown-wrap font-heading">
                  <ul>
                    {% for c in categories|slice:":5" %}
                      <li>
                        <input
                          data-filter="category"
                          class="form-check-input filter-checkbox"
                          type="checkbox"
                          name="checkbox"
                          id="exampleCheckbox2"
                          value="{{ c.id }}"
                        />
                        &nbsp;&nbsp;
                        <a href="{% url 'core:category-product-list' c.cid %}">
                          <img src="{{c.image.url}}" alt="" />{{ c.title }}</a
                        >
                      </li>
                    {% endfor %}
                  </ul>
                </div>
              </div>

参考片

wwwo4jvm

wwwo4jvm2#

这将是一个选择:arr = ["tool1", "tool2", ... , "tool10"]

{% for tool in arr %}
  {% if forloop.revcounter0 <= 4 %}
    {{ tool }}
  {% else %}
    <!--empty-->
  {% endif %}
{% endfor %}

基本上,这段代码所做的不是中断for循环,而是在不满足条件时输入“nothing”。另一句话:在迭代五次之后,它不再插入变量,而是插入“nothing”。
你现在可能会想争辩:“打破循环而不是在不插入任何东西的情况下继续迭代过程会更有效”。是的,我同意。但是为了使这个过程更有效,您的方法是在将列表传递给模板之前,在视图中将列表的长度削减到一个合适的长度。据我所知,没有办法打破djangos模板语言中的循环。
{% break %}不是djangos模板语言中的内置关键字,因此默认情况下它总是以语法错误结束。所以这个错误与你把它放在{% block ... %}标签中的事实无关。
阅读更多关于forloop.revcounter0

相关问题