답변:
특별한 태그와 추가 컨텍스트가없는 작은 경우에 잘 작동하는 간단한 기술을 사용했습니다. 때때로 이것은 편리합니다
{% 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 %}
이 문제에 대한 나의 생각은 가장 좋다고 생각합니다. templatetags 디렉토리에 my_filters.py를 유지합니다.
@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)
숫자가 0이 아닌 1부터 시작 얻을
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 []
. 그렇게하면 오류가 발생하지 않으며 빈 배열을 반환합니다 (대부분의 템플릿 기능 작동 방식과 유사).
바인딩을 전달할 수 있습니다
{'n' : range(n) }
템플릿으로 이동 한 다음
{% for i in n %}
...
{% endfor %}
0 기반 동작 (0, 1, ... n-1)이 나타납니다.
(Python3 호환성을 위해 업데이트 됨)
range(n)
파이썬 3에서 사용 , 만약 내가 그것을 정확하게 기억한다면, xrange는 더 이상 사용되지 않습니다
다른 사람 이이 질문을 겪을 경우를 대비하여 ... 템플릿 태그를 만들었습니다 range(...)
. http://www.djangosnippets.org/snippets/1926/
'range'내장과 동일한 인수를 허용하고 다음을 포함하는 목록을 작성합니다. '범위'의 결과. 통사론: context_name %}로 {% mkrange [start,] stop [, step] 예를 들면 다음과 같습니다. {% mkrange 5 10 2 some_range %} {some_range %에서 i의 %} {{i}} : 반복하고 싶은 것 \ n {% endfor %} 생산 : 5 : 반복하고 싶은 것 7 : 반복하고 싶은 것 9 : 반복하고 싶은 것
나는이 질문에 매우 열심히 노력했고 여기에 가장 좋은 대답을 찾을 수 있습니다 : ( django 템플릿에서 7 번 반복하는 방법에서 )
idx에 액세스 할 수도 있습니다!
views.py :
context['loop_times'] = range(1, 8)
html :
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
당신은 전달할 수 있습니다 :
{ 'n': 범위 (n)}
템플릿을 사용하려면
{% in i % n} ... {% endfor %}
템플릿에서 " slice "를 사용해야 합니다. 예를 들면 다음과 같습니다.
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 %}
이제 0-6 또는 하드 코딩 대신 1-6을 수행 할 수 있습니다. 단계를 추가하려면 템플릿 태그가 필요합니다. 더 많은 사용 사례를 다루므로 앞으로 나아갑니다.
이것은 본질적으로 range
기능 이 필요합니다 . 이를 위해 Django 기능 티켓 ( https://code.djangoproject.com/ticket/13088 ) 이 제기 되었지만 다음과 같은 주석으로 "수정되지 않음"으로 마감되었습니다.
이 아이디어에 대한 나의 인상은 그것이 템플릿에서 프로그래밍으로 이어지고 있다는 것입니다. 렌더링해야하는 옵션 목록이 있으면 템플릿이 아닌보기에서 계산해야합니다. 그것이 값의 범위만큼 간단하다면, 그렇게하십시오.
그것들은 좋은 지적이 있습니다-템플릿은 뷰를 매우 간단하게 표현해야합니다. 뷰에서 제한된 필수 데이터를 작성하고 컨텍스트에서 템플리트로 전달해야합니다.