Django 템플릿의 숫자 for 루프


261

forDjango 템플릿에서 숫자 루프를 작성하려면 어떻게합니까 ? 나는 같은 것을 의미한다

for i = 1 to n

답변:


392

특별한 태그와 추가 컨텍스트가없는 작은 경우에 잘 작동하는 간단한 기술을 사용했습니다. 때때로 이것은 편리합니다

{% for i in '0123456789'|make_list %}
    {{ forloop.counter }}
{% endfor %}

9
FWIW, 012 == 12이므로 1과 2 만 반복됩니다.
Jason

22
{ '0123456789'| make_list %}의 i에 대한 %는 0을 건너 뛰지 않고 10을 반복합니다.
Rick

7
'rjust'로 임의 길이의 문자열 생성{% for i in "x"|rjust:"100" %}
Aaron

27
세 번째로이 답변은 잘못되었습니다 . 이것을 사용하지 마십시오. 템플릿 태그를 사용하여 올바르게 수행하십시오. 나는 대답이 나쁘다는 것을 알지 못합니다. 댓글을 삭제하기에 충분한 이유입니다.
Rebs

6
@Rebs이게 왜 그렇게 나쁜가요? 확실히 해킹이지만 프로젝트에서 한 번에 작은 범위를 반복해야하기 때문에 템플릿 태그를 추가하는 것도 좋은 해결책이 아닙니다.
tobltobs

114
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}

9
좋은 대답입니다. center는 n 개의 공백 문자열을 생성 한 다음 반복되기 때문에 작동합니다. 그런 다음 각 공백 문자는 무시되지만 범위의 현재 값은 forloop.counter (또는 forloop.counter0)에서 찾을 수 있습니다. 참조 docs.djangoproject.com/en/dev/ref/templates/builtins/#center
isedwards

2
좋은 답변입니다! 새 필터를 만들 필요가 없습니다.
Miguel Ike

볼 필요가 없습니다. 탁월한 해킹
Mohammed Shareef C

106

불행히도 Django 템플릿 언어 에서는 지원되지 않습니다 . 거기에있는 몇 가지제안 하지만, 조금 복잡한 것 같다. 컨텍스트에 변수를 넣을 것입니다.

...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...

그리고 템플릿에서 :

{% for i in range %}
     ...
{% endfor %}

13
장고 저자가 템플릿에서 일반 파이썬을 허용하지 않기위한 동기 부여는 끔찍한 결과가 아니라는 데 어려움을 겪는 데 소요되는 시간과 잃어버린 시간과 비교할 때 무의미하고 중요하지 않은 것처럼 보입니다. )은 이미 있습니다!
Bogatyr

2
@Bogatyr 이것이 원하는 것이라면
tghw

78

이 문제에 대한 나의 생각은 가장 좋다고 생각합니다. 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 %}

1
이것이 올바른 해결책이라고 생각합니다. 수행 range(1, 16)숫자가 0이 아닌 1부터 시작 얻을
chhantyal

또한 templatetags 디렉토리에 빈 파일 _ init _.py를 작성하십시오. 또한이 행을 my_filters.py의 맨 위에 추가하십시오 from django.template import Library;register = Library()
Ajeeb.KP

두 번째 필터 매개 변수를 추가하면 파이썬에 전체 범위 기능이 내장됩니다. @register.filter(name='range') def filter_range(start, end): return range(start, end)그런 다음로 사용됩니다 {% for i in 1|range:6 %}{% endfor %}. 아래의 전체 답변을 참조하십시오 ....
Paul Kenjora

이것을 약간 변경했습니다 (실례 형식) : try: return range(number) except: return []. 그렇게하면 오류가 발생하지 않으며 빈 배열을 반환합니다 (대부분의 템플릿 기능 작동 방식과 유사).
Tim Tisdall


41

바인딩을 전달할 수 있습니다

{'n' : range(n) }

템플릿으로 이동 한 다음

{% for i in n %}
...
{% endfor %}

0 기반 동작 (0, 1, ... n-1)이 나타납니다.

(Python3 호환성을 위해 업데이트 됨)


1
range(n)파이썬 3에서 사용 , 만약 내가 그것을 정확하게 기억한다면, xrange는 더 이상 사용되지 않습니다
Felício

실제로 그렇습니다. 그리고 그것은 앱을 Python3으로 전환 할 때 우연히 만났던 두 줄의 코드 중 하나였습니다.
Dave W. Smith

9

n자신을 전달하지 않고 range(n)[0에서 n-1까지의 정수 목록 포함] 뷰에서 템플릿으로 전달하고 후자에서 수행합니다 {% for i in therange %}(일반적으로 0이 아닌 1을 기본으로 고집하는 경우) forloop.counter루프 본문에서 사용할 수있는 기반 인덱스 ;-).


9

다른 사람 이이 질문을 겪을 경우를 대비하여 ... 템플릿 태그를 만들었습니다 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 : 반복하고 싶은 것


1
변수 인수를 지원하는 Alex Pi의 스 니펫을 선호하는 -1
m000


9

당신은 전달할 수 있습니다 :

{ 'n': 범위 (n)}

템플릿을 사용하려면

{% in i % n} ... {% endfor %}


코드를 관리하는 다음 사람이라면 어떤 일이 일어나고 있는지 이해하기 쉽고 이해하기 쉽다
rossdavidh

7

템플릿에서 " 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>

1
이것이 OP가 찾고있는 것인지 확실하지 않지만 정확히 내가 찾던 것입니다. =)
GChorn

7

이 방법은 표준 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))
Bedilbek

@Bedilbek이 코드는 표준 파이썬 범위를 모방합니다. 명시 적 단계 매개 변수가 없으면 음수 범위를 지원하지 않습니다. >>> list (range (10,2)) [] >>> list (range (10,2, -1)) [10, 9, 8, 7, 6, 5, 4, 3]
Rebs

5

나는 대중적인 대답을 조금 더 나아가서 더 강력하게 만들고 있습니다. 이를 통해 시작 지점을 지정할 수 있습니다 (예 : 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을 수행 할 수 있습니다. 단계를 추가하려면 템플릿 태그가 필요합니다. 더 많은 사용 사례를 다루므로 앞으로 나아갑니다.


이것은 @ guillermo-siliceo-trueba 답변의 확장입니다.
Paul Kenjora

5

이것은 본질적으로 range기능 이 필요합니다 . 이를 위해 Django 기능 티켓 ( https://code.djangoproject.com/ticket/13088 ) 이 제기 되었지만 다음과 같은 주석으로 "수정되지 않음"으로 마감되었습니다.

이 아이디어에 대한 나의 인상은 그것이 템플릿에서 프로그래밍으로 이어지고 있다는 것입니다. 렌더링해야하는 옵션 목록이 있으면 템플릿이 아닌보기에서 계산해야합니다. 그것이 값의 범위만큼 간단하다면, 그렇게하십시오.

그것들은 좋은 지적이 있습니다-템플릿은 뷰를 매우 간단하게 표현해야합니다. 뷰에서 제한된 필수 데이터를 작성하고 컨텍스트에서 템플리트로 전달해야합니다.


6
보기는 데이터 용이고 템플릿은 프리젠 테이션 용이어야합니다. 보기에는 템플리트의 내용, 특히 범위에 대한 지식이 필요하지 않아야합니다. 이러한 기능 요청을 무시한 Django의 이유는 완전히 쓰레기입니다.
Rebs

3

당신이 사용할 수있는: {% with ''|center: i as range %}


1
이것이 어떻게 작동하는지에 대한 예 / 설명을 제공 할 수 있습니까?
Rebs

1

간단한 답변을 찾고있는 사람들은 많은 양의 값을 표시해야합니다. 예를 들어 100 개의 게시물 {% for post in posts|slice:"3" %}중 3 개를 정상적으로 추가 하고 반복하면 3 개의 게시물 만 추가됩니다.


0

숫자가 모델에서 나온다면 모델에 멋진 패치라는 것을 알았습니다.

def iterableQuantity(self):
    return range(self.quantity)

2
왜 당신이 투표를 받는지 잘 모르겠습니다. 그것은 정답입니다. 위에서 제공 한 적절한 필터를 구현하는 것과 비교 하여이 솔루션을 좋아하지 않습니다. DB 모델은 간결해야합니다. 그러나 여전히 대다수의 대답보다 낫습니다.
Rebs

나도 몰라…
Alper

나는 9 년이 너무 늦었지만 나는 당신에게 명예를 떨쳤다.
Sahil

-5
{% for i in range(10) %}
   {{ i }}

{% endfor %}

이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
xiawi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.