โมดูลัส% ในเทมเพลต Django


121

ฉันกำลังมองหาวิธีใช้ตัวดำเนินการโมดูลัสใน django สิ่งที่ฉันพยายามทำคือเพิ่มชื่อคลาสให้กับทุกองค์ประกอบที่สี่ในลูป

ด้วยโมดูลัสมันจะมีลักษณะดังนี้:

{% 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 %}

แน่นอนว่าสิ่งนี้ใช้ไม่ได้เพราะ% เป็นอักขระที่สงวนไว้ มีวิธีอื่นในการทำเช่นนี้หรือไม่?


คุณได้ลองหรือยัง? Django ให้templatetagแท็ก แต่ที่ครอบคลุม{%, %}เป็นต้น (ไม่ได้%)
Platinum Azure

4
ใช่ฉันลองแล้ว แต่ได้รับข้อผิดพลาดต่อไปนี้: ไม่สามารถแยกวิเคราะห์ส่วนที่เหลือ: '%' จาก '%' ฉันคิดว่าเป็นเพราะมันไม่รู้ว่าจะแยกโมดูลอย่างไร นอกจากนี้ตัวดำเนินการยังไม่ปรากฏในเอกสารdocs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

คำตอบ:


210

คุณต้องหารด้วยตัวกรอง django ในตัว

{% 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
อาใช่นั่นแหล่ะ ใช้วงจรตอนนี้ แต่เหมาะสำหรับการอ้างอิงในอนาคต ฉันไม่ต้องการใช้วงจรกับโมดูลอร์ 100 หรือบางอย่าง :) อันที่จริงฉันไปทำเครื่องหมายคำตอบนี้ว่าเป็นคำตอบที่ถูกต้อง เพราะมันมุ่งเน้นไปที่โมดูลอร์ไม่ใช่วิธีแก้ปัญหา ...
underdoeg

15

คุณไม่สามารถใช้ตัวดำเนินการโมดูลัสในแท็กเทมเพลต Django ได้ แต่จะง่ายพอที่จะเขียนตัวกรองเพื่อทำเช่นนั้น สิ่งนี้ควรใช้งานได้:

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

แล้ว:

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

คุณสามารถทำสิ่งนี้แทน:

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

แล้ว:

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

หรือคุณสามารถใช้cycleแท็ก:

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


13

ตัวอย่างแถวและคอลัมน์ Bootstrap แถวใหม่ทุก 4 รายการ ปิดแถวสุดท้ายด้วยแม้ว่าจะมีน้อยกว่า 4 รายการก็ตาม

myapp / templatetags / my_tags.py

from django import template

register = template.Library()

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

เทมเพลต 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
นี่เป็นคำตอบที่ดีกว่าเนื่องจากอธิบายถึงสิ่งที่จำเป็นในการสร้างไดเร็กทอรีและอธิบายถึงความจำเป็นในการโหลดเทมเพลตที่กำหนดเองในเทมเพลต html ด้วย ขอบคุณ.
truthadjustr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.