Programing

Django 템플릿의 숫자 for 루프

lottogame 2020. 4. 13. 08:09
반응형

Django 템플릿의 숫자 for 루프


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

for i = 1 to n

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

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

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

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

그리고 템플릿에서 :

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

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

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

어쩌면 이렇게?

{% for i in "x"|rjust:"100" %}
...
{% endfor %}

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

{'n' : range(n) }

템플릿으로 이동 한 다음

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

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

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


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


다른 그냥 넣다 사람이 질문 건너 온다 ... 난 당신을 만들 수있는 템플릿 태그를 만들었습니다 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 : 반복하고 싶은 것


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

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

나는이 질문에 매우 열심히 노력했고 여기에 가장 좋은 대답을 찾을 수 있습니다 : ( django 템플릿에서 7 번 반복하는 방법에서 )

idx에 액세스 할 수도 있습니다!

views.py :

context['loop_times'] = range(1, 8)

html :

{% for i in loop_times %}
        <option value={{ i }}>{{ i }}</option>
{% endfor %}

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


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


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

{ 'n': 범위 (n)}

템플릿을 사용하려면

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


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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/1107737/numeric-for-loop-in-django-templates

반응형