ฉันจะเขียนfor
ลูปตัวเลขในเทมเพลต Django ได้อย่างไร ฉันหมายถึงสิ่งที่ชอบ
for i = 1 to n
ฉันจะเขียนfor
ลูปตัวเลขในเทมเพลต Django ได้อย่างไร ฉันหมายถึงสิ่งที่ชอบ
for i = 1 to n
คำตอบ:
ฉันใช้เทคนิคง่าย ๆ ที่ทำงานได้ดีสำหรับกรณีเล็ก ๆ โดยไม่มีแท็กพิเศษและไม่มีบริบทเพิ่มเติม บางครั้งสิ่งนี้มีประโยชน์
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
น่าเสียดายที่ไม่รองรับภาษาเทมเพลต Django มีความเป็นคู่ ของข้อเสนอแนะแต่พวกเขาดูเหมือนซับซ้อนน้อย ฉันจะใส่ตัวแปรในบริบท:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
และในเทมเพลต:
{% for i in range %}
...
{% endfor %}
เรื่องของฉันเกี่ยวกับเรื่องนี้ฉันคิดว่ามันอร่อยที่สุด ฉันเก็บ my_filters.py ไว้ในไดเรกทอรี templatetags
@register.filter(name='times')
def times(number):
return range(number)
และคุณจะใช้สิ่งนี้:
{% load my_filters %}
{% for i in 15|times %}
<li>Item</li>
{% endfor %}
range(1, 16)
เพื่อให้ได้ตัวเลขตั้งแต่วันที่ 1 ไม่ใช่ 0.
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
{% for i in 1|range:6 %}{% endfor %}
ดูคำตอบแบบเต็มด้านล่าง ....
try: return range(number) except: return []
(ข้ออ้างการจัดรูปแบบ): วิธีนั้นจะไม่ทำให้เกิดข้อผิดพลาดและส่งกลับอาร์เรย์ที่ว่างเปล่า (คล้ายกับการทำงานของแม่แบบส่วนใหญ่)
อาจจะเป็นแบบนี้?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
คุณสามารถผ่านการผูกพัน
{'n' : range(n) }
ไปที่เทมเพลตจากนั้นทำ
{% for i in n %}
...
{% endfor %}
โปรดทราบว่าคุณจะได้รับพฤติกรรมตาม 0 (0, 1, ... n-1)
(อัปเดตเพื่อรองรับ Python3)
range(n)
ใน python 3 ถ้าฉันจำได้ถูกต้อง xrange ก็เลิกใช้แล้ว
คุณไม่ผ่านn
ตัวเอง แต่range(n)
[รายชื่อของจำนวนเต็มจาก 0 ถึง n-1 รวม] จากมุมมองของคุณแม่แบบของคุณและในสมัยที่คุณทำ{% for i in therange %}
(ถ้าคุณอย่างแน่นอนยืนยันใน 1 ตามมากกว่าปกติ 0 ดัชนีพื้นฐานที่คุณสามารถใช้forloop.counter
ในร่างกายของวง ;-)
แค่ใส่เคสคนอื่นเจอคำถามนี้…ฉันได้สร้างเทมเพลตแท็กที่ให้คุณสร้างrange(...)
: http://www.djangosnippets.org/snippets/1926/
ยอมรับอาร์กิวเมนต์เช่นเดียวกับ builtin 'range' และสร้างรายการที่มี ผลลัพธ์ของ 'ช่วง' ไวยากรณ์: {% mkrange [เริ่ม,] หยุด [, ขั้นตอน] เป็น context_name%} ตัวอย่างเช่น: {% mkrange 5 10 2 เป็น some_range%} {% สำหรับฉันใน some_range%} {{i}}: บางสิ่งที่ฉันต้องการทำซ้ำ \ n {% endfor%} ผลิต: 5: บางสิ่งที่ฉันต้องการทำซ้ำ 7: บางสิ่งที่ฉันต้องการทำซ้ำ 9: บางสิ่งที่ฉันต้องการทำซ้ำ
ฉันพยายามอย่างหนักกับคำถามนี้และฉันพบคำตอบที่ดีที่สุดที่นี่: (จากการวนรอบ 7 ครั้งในเทมเพลต django )
คุณสามารถเข้าถึง idx ได้!
views.py:
context['loop_times'] = range(1, 8)
HTML:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
คุณสามารถผ่าน:
{'n': range (n)}
วิธีใช้เทมเพลต:
{% สำหรับฉันใน n%} ... {% endfor%}
คุณควรใช้ " ชิ้น " ในแม่แบบเช่นนี้:
ใน views.py
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
ใน store_list.html:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
วิธีนี้รองรับฟังก์ชั่นทั้งหมดของrange([start,] stop[, step])
ฟังก์ชั่นมาตรฐาน
<app>/templatetags/range.py
from django import template
register = template.Library()
@register.filter(name='range')
def _range(_min, args=None):
_max, _step = None, None
if args:
if not isinstance(args, int):
_max, _step = map(int, args.split(','))
else:
_max = args
args = filter(None, (_min, _max, _step))
return range(*args)
การใช้งาน:
{% load range %}
<p>stop 5
{% for value in 5|range %}
{{ value }}
{% endfor %}
</p>
<p>start 5 stop 10
{% for value in 5|range:10 %}
{{ value }}
{% endfor %}
</p>
<p>start 5 stop 10 step 2
{% for value in 5|range:"10,2" %}
{{ value }}
{% endfor %}
</p>
เอาท์พุต
<p>stop 5
0 1 2 3 4
</p>
<p>start 5 stop 10
5 6 7 8 9
</p>
<p>start 5 stop 10 step 2
5 7 9
</p>
for value in 0|range:"10,2"
วิธีการแก้ปัญหาของคุณไม่ทำงานบน คุณต้องเปลี่ยนรหัสดังนี้:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
ฉันแค่ใช้คำตอบที่ได้รับความนิยมเพิ่มขึ้นอีกเล็กน้อยและทำให้แข็งแกร่งขึ้น สิ่งนี้ช่วยให้คุณระบุจุดเริ่มต้นใด ๆ ได้เช่น 0 หรือ 1 นอกจากนี้ยังใช้ฟีเจอร์พิสัยของไพ ธ อนที่ส่วนท้ายมีค่าน้อยกว่าจึงสามารถใช้กับความยาวของรายการได้โดยตรง
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
จากนั้นในเทมเพลตของคุณให้รวมไฟล์แท็กเทมเพลตด้านบนและใช้สิ่งต่อไปนี้:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
ตอนนี้คุณสามารถทำได้ 1-6 แทนที่จะเป็นเพียง 0-6 หรือการเข้ารหัสอย่างหนัก การเพิ่มขั้นตอนจะต้องใช้แท็กเทมเพลตซึ่งจะครอบคลุมการใช้งานมากขึ้นดังนั้นจึงเป็นขั้นตอนต่อไป
สิ่งนี้จำเป็นต้องมีrange
ฟังก์ชั่น ตั๋วฟีเจอร์ Django ถูกยกขึ้น ( https://code.djangoproject.com/ticket/13088 ) สำหรับสิ่งนี้ แต่ปิดเนื่องจาก "ไม่แก้ไข" พร้อมกับความคิดเห็นต่อไปนี้
ความประทับใจของฉันเกี่ยวกับความคิดนี้คือมันกำลังพยายามนำไปสู่การเขียนโปรแกรมในเทมเพลต หากคุณมีรายการของตัวเลือกที่จำเป็นต้องแสดงผลพวกเขาควรจะคำนวณในมุมมองไม่ใช่ในแม่แบบ ถ้ามันง่ายเหมือนช่วงของค่าลองดูสิ
พวกเขามีจุดดี - เทมเพลตควรจะเป็นมุมมองที่ง่ายมาก คุณควรสร้างข้อมูลที่จำเป็นอย่าง จำกัด ในมุมมองและส่งต่อไปยังเทมเพลตในบริบท
คุณสามารถใช้ได้:
{% with ''|center: i as range %}
สำหรับผู้ที่ต้องการคำตอบง่ายๆเพียงแค่ต้องการแสดงค่าจำนวนหนึ่งให้พูดว่า 3 จาก 100 โพสต์ตัวอย่างเพียงแค่เพิ่ม{% for post in posts|slice:"3" %}
และวนซ้ำตามปกติและจะเพิ่มเพียง 3 โพสต์
หากตัวเลขมาจากแบบจำลองฉันพบว่านี่เป็น patch ที่ดีสำหรับรุ่น:
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}