둘 이상의 행 집합이있는 Django 템플릿의 대체 행 색상 지정
Django 템플릿은 템플릿의 cycle
서로 다른 지점 (또는 템플릿의 for 루프)에서 여러 값을 번갈아 가며 사용할 수있는 내장 태그 를 제공 하지만이 태그는 cycle
s 정의 외부의 범위에서 액세스 할 때 재설정되지 않습니다 . 당신이 당신의 템플릿에 두 개 이상의 목록이있는 경우 즉, 모든 행은 그 중 일부 CSS 정의를 사용하고 싶습니다 odd
하고 even
, 목록의 첫 번째 행은하지 신선한 반복으로, 여기서 마지막으로 왼쪽 오프를 데리러 선택 항목 ( odd
및 even
)에서
예를 들어, 다음 코드에서 첫 번째 블로그에 홀수 항목이있는 경우 두 번째 블로그의 첫 번째 항목은에서 시작 even
하고 싶을 때으로 시작 odd
합니다.
{% for blog in blogs %}
{% for entry in blog.entries %}
<div class="{% cycle 'odd' 'even' %}" id="{{entry.id}}">
{{entry.text}}
</div>
{% endfor %}
{% endfor %}
resetcycle
여기에 제공된 태그 로 패치하여이 문제를 해결하려고 했습니다.
Django 티켓 :주기 태그가 범위를 벗어난 후 재설정되어야합니다.
아무 소용이 없습니다. (코드가 작동하지 않았습니다.)
또한 내부 루프를 사용자 정의 태그로 이동하려고 시도했지만 컴파일 / 렌더링주기가 루프를 다시 외부 루프로 이동하기 때문에 작동하지 않았습니까? (이유와 상관없이 저에게는 효과가 없었습니다.)
이 간단한 작업을 어떻게 수행 할 수 있습니까!? 이 정보를 미리 컴파일하여 내보기에 데이터 구조를 생성하지 않으려 고합니다. 불필요 해 보입니다. 미리 감사드립니다.
가장 쉬운 해결 방법 (resetcycle 패치가 수정되고 적용될 때까지)은 forloop.counter와 함께 내장 된 "divisibleby"필터를 사용하는 것입니다.
{% for entry in blog.entries %}
<div class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}" id="{{ entry.id }}">
{{ entry.text }}
</div>
{% endfor %}
조금 더 장황하지만 이해하기 어렵지는 않으며 훌륭하게 작동합니다.
https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#cycle
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
태그 cycle
및 resetcycle
(Django 1.11의 새로운 기능) 호출을 사용할 수 있습니다 ( https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-resetcycle에서 ) :
{% for blog in blogs %}
{% cycle 'odd' 'even' as rowcolors silent %}
{% resetcycle rowcolors %}
{% for entry in blog.entries %}
{% cycle rowcolors %}
<div class="{{ rowcolors }}" id="{{entry.id}}">
{{ entry.text }}
</div>
{% endfor %}
{% endfor %}
Jinja2 템플릿 시스템 포기 및 사용
나는 django 템플릿 언어를 포기했습니다. 그것은 당신이 할 수있는 일에 매우 제한적입니다. Jinja2는 django 템플릿에서 사용하는 것과 동일한 구문을 사용하지만 여기에 많은 개선 사항이 추가되었습니다.
편집 / 참고 (저는 사소한 문제에 대한 큰 스위치처럼 들리지만 실제로는 항상 django의 기본 템플릿 시스템과 싸우고 있다는 것을 알고 있으므로 실제로 가치가 있으며 더 생산적으로 만들 것이라고 믿습니다. 장기.)
작성자가 작성한이 기사 를 읽을 수 있습니다. 기술적 인 내용이지만 장고의 {% cycle %} 태그 문제에 대해 언급합니다.
Jinja에는 순환 태그가 없으며 루프에 순환 방법이 있습니다.
{% for user in users %}
<li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}
Jinja2의 가장 큰 장점은 프리젠 테이션에 로직을 사용할 수 있다는 것입니다. 따라서 사진 목록이 있으면 테이블에 넣을 수 있습니다. 테이블 내에서 N 요소마다 새 행을 시작할 수 있기 때문입니다. 예를 들어 다음과 같이 할 수 있습니다.
{% if loop.index is divisibleby(5) %}
</tr>
{% if not loop.last %}
<tr>
{% endif %}
{% endif %}
수학 식을 사용할 수도 있습니다.
{% if x > 10 %}
파이썬 함수에 직접 액세스 할 수 있습니다 (그러나 템플릿에 대해 노출되어야하는 함수를 지정하려면 일부 설정이 필요합니다)
{% for item in normal_python_function_that_returns_a_query_or_a_list() %}
변수 설정도 ..
{% set variable_name = function_that_returns_an_object_or_something() %}
나는 forloop.counter0을 사용하여 그렇게하게됩니다-훌륭하게 작동합니다!
{% for product in products %}
{% if forloop.counter0|divisibleby:4 %}<div class="clear"></div>{% endif %}
<div class="product {% if forloop.counter0|divisibleby:4 %}col{% else %}col20{% endif %}">
Lorem Ipsum is simply dummy text
</div>
{% endfor %}
The easiest answer might be: "give up and use jQuery." If that's acceptable it's probably easier than fighting with Django's templates over something so simple.
There's a way to do it server-side with an iterator that doesn't keep a simultaneous copy of all the entries:
import itertools
return render_to_response('template.html',
{
"flattened_entries": itertools.chain(*(blog.entries for blog in blogs)),
})
'developer tip' 카테고리의 다른 글
Amazon RDS에서 csv 파일로 테이블 내보내기 (0) | 2020.12.12 |
---|---|
BAT 파일의 "입력 라인이 너무 깁니다"오류 (0) | 2020.12.12 |
C # : 이벤트 또는 관찰자 인터페이스? (0) | 2020.12.11 |
PHP & (앰퍼샌드, 비트 및) 연산자 이해 (0) | 2020.12.11 |
필드의 "길이"에 대한 MySQL SELECT 문이 1보다 큽니다. (0) | 2020.12.11 |