Tôi muốn làm điều gì đó như:
biến p là từ test.py là danh sách ['a', 'b', 'c', 'd']
{% for i in p %}
{{variable++}}
{{variable}}
kết quả đầu ra là:
1 2 3 4
Tôi muốn làm điều gì đó như:
biến p là từ test.py là danh sách ['a', 'b', 'c', 'd']
{% for i in p %}
{{variable++}}
{{variable}}
kết quả đầu ra là:
1 2 3 4
Câu trả lời:
Bạn có thể sử dụng loop.index
:
{% for i in p %}
{{ loop.index }}
{% endfor %}
Kiểm tra tài liệu thiết kế mẫu .
Trong các phiên bản gần đây hơn, do các quy tắc xác định phạm vi, những điều sau sẽ không hoạt động:
{% set count = 1 %}
{% for i in p %}
{{ count }}
{% set count = count + 1 %}
{% endfor %}
Sau 2.10, để giải quyết vấn đề phạm vi, bạn có thể làm như sau:
{% set count = namespace(value=0) %}
{% for i in p %}
{{ count.value }}
{% set count.value = count.value + 1 %}
{% endfor %}
Như Jeroen nói rằng có những vấn đề về phạm vi: nếu bạn đặt 'số lượng' bên ngoài vòng lặp, bạn không thể sửa đổi nó bên trong vòng lặp.
Bạn có thể đánh bại hành vi này bằng cách sử dụng một đối tượng thay vì một đại lượng vô hướng cho 'số lượng':
{% set count = [1] %}
Bây giờ bạn có thể thao tác đếm bên trong một vòng chia hoặc thậm chí% bao gồm%. Đây là cách tôi tăng số lượng (vâng, rất khó nhưng tốt):
{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
{% set count = [] %}
, thêm một mục vào danh sách trong mỗi vòng lặp {% set __ = index.append(1) %}
và sử dụng độ dài để hiển thị chỉ mục index|length
.
{% set count = [ ] %}
, thêm một mục vào danh sách trong mỗi vòng lặp {% set __ = count.append(1) %}
và sử dụng độ dài để hiển thị số đếmcount|length
Đây là giải pháp của tôi:
Đặt tất cả các bộ đếm trong một từ điển:
{% set counter = {
'counter1': 0,
'counter2': 0,
'etc': 0,
} %}
Xác định macro để tăng chúng dễ dàng:
{% macro increment(dct, key, inc=1)%}
{% if dct.update({key: dct[key] + inc}) %} {% endif %}
{% endmacro %}
Bây giờ, bất cứ khi nào bạn muốn tăng bộ đếm 'counter1', chỉ cần thực hiện:
{{ increment(counter, 'counter1') }}
Tôi cũng đã đấu tranh với hành vi này. Tôi muốn thay đổi lớp div trong jinja dựa trên bộ đếm. Tôi rất ngạc nhiên rằng cách pythonic không hoạt động. Mã sau đang gửi lại bộ đếm của tôi trên mỗi lần lặp, vì vậy tôi chỉ có lớp màu đỏ.
{% if sloupec3: %}
{% set counter = 1 %}
{% for row in sloupec3: %}
{% if counter == 3 %}
{% set counter = 1 %}
{% endif %}
{% if counter == 1: %}
<div class="red"> some red div </div>
{% endif %}
{% if counter == 2: %}
<div class="gray"> some gray div </div>
{% endif %}
{% set counter = counter + 1 %}
{% endfor %}
{% endif %}
Tôi đã sử dụng loop.index như thế này và nó hoạt động:
{% if sloupec3: %}
{% for row in sloupec3: %}
{% if loop.index % 2 == 1: %}
<div class="red"> some red div </div>
{% endif %}
{% if loop.index % 2 == 0: %}
<div class="gray"> some gray div </div>
{% endif %}
{% endfor %}
{% endif %}
nếu ai đó muốn thêm một giá trị bên trong vòng lặp thì bạn có thể sử dụng nó, nó hoạt động 100%
{% set ftotal= {'total': 0} %}
{%- for pe in payment_entry -%}
{% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %}
{%- endfor -%}
{{ftotal.total}}
đầu ra = 5
Đã tìm kiếm cách làm việc này của Django và tìm thấy bài đăng này. Có thể ai đó khác cần giải pháp django đến đây.
{% for item in item_list %}
{{ forloop.counter }} {# starting index 1 #}
{{ forloop.counter0 }} {# starting index 0 #}
{# do your stuff #}
{% endfor %}
Đọc thêm tại đây: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/