Modulus% trong mẫu Django


120

Tôi đang tìm cách sử dụng một cái gì đó giống như toán tử mô-đun trong django. Những gì tôi đang cố gắng làm là thêm một tên lớp vào mọi phần tử thứ tư trong một vòng lặp.

Với modulus, nó sẽ như thế này:

{% for p in posts %}
    <div class="post width1 height2 column {% if forloop.counter0 % 4 == 0 %}first{% endif %}}">
        <div class="preview">

        </div>
        <div class="overlay">

        </div>
        <h2>p.title</h2>
    </div>
{% endfor %}

Tất nhiên điều này không hoạt động vì% là một ký tự dành riêng. Có cách nào khác để thực hiện điều này không?


Bạn thậm chí đã thử nó? Django cung cấp templatetagthẻ, nhưng điều đó bìa {%, %}vv (không %).
Platinum Azure

4
vâng, tôi đã thử nó, nhưng tôi gặp lỗi sau: Không thể phân tích cú pháp phần còn lại: '%' from '%' Tôi cho rằng đó là vì nó không biết cách phân tích mô-đun. Nhà điều hành cũng không được liệt kê trên docs docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

Câu trả lời:


210

Bạn cần divisibleby , được xây dựng trong django lọc.

{% for p in posts %}
    <div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}">
        <div class="preview">

        </div>
        <div class="overlay">

        </div>
        <h2>p.title</h2>
    </div>
{% endfor %}

1
à vâng, chính xác là như vậy. sử dụng chu kỳ bây giờ, nhưng tốt để tham khảo trong tương lai. Tôi sẽ không muốn sử dụng chu kỳ với modulor 100 hoặc một cái gì đó :) Thực ra tôi muốn đánh dấu câu trả lời này là câu trả lời đúng. vì nó tập trung vào Modulor và không phải là một cách giải quyết ...
underdoeg

15

Bạn không thể sử dụng toán tử mô-đun trong các thẻ mẫu Django, nhưng sẽ đủ dễ dàng để viết một bộ lọc để làm như vậy. Một cái gì đó như thế này sẽ hoạt động:

@register.filter
def modulo(num, val):
    return num % val

Và sau đó:

{% ifequal forloop.counter0|modulo:4 0 %}

Bạn thậm chí có thể làm điều gì đó như thế này, thay vào đó:

@register.filter
def modulo(num, val):
    return num % val == 0

Và sau đó:

{% if forloop.counter0|modulo:4 %}

Hoặc bạn có thể sử dụng cyclethẻ:

<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">


12

Ví dụ về hàng và cột trong Bootstrap. Hàng mới mỗi 4 món. Cũng đóng hàng cuối cùng ngay cả khi có ít hơn 4 mục.

myapp / templatetags / my_tags.py

from django import template

register = template.Library()

@register.filter
def modulo(num, val):
    return num % val

mẫu html

{% load my_tags %}

{% for item in all_items %} 
    {% if forloop.counter|modulo:4 == 1 %}
        <div class="row">
    {% endif %}

        <div class="col-sm-3">
            {{ item }}
        </div>

    {% if forloop.last or forloop.counter|modulo:4 == 0 %}
        </div>
    {% endif %}

{% endfor %}

2
Đây là câu trả lời tốt hơn vì nó mô tả thư mục cần thiết được tạo ra và nó mô tả nhu cầu tải mẫu tùy chỉnh trong html mẫu cũng như. Cảm ơn bạn.
truthadjustr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.