developer tip

둘 이상의 행 집합이있는 Django 템플릿의 대체 행 색상 지정

optionbox 2020. 12. 11. 08:05
반응형

둘 이상의 행 집합이있는 Django 템플릿의 대체 행 색상 지정


Django 템플릿은 템플릿의 cycle서로 다른 지점 (또는 템플릿의 for 루프)에서 여러 값을 번갈아 가며 사용할 수있는 내장 태그 제공 하지만이 태그는 cycles 정의 외부의 범위에서 액세스 할 때 재설정되지 않습니다 . 당신이 당신의 템플릿에 두 개 이상의 목록이있는 경우 즉, 모든 행은 그 중 일부 CSS 정의를 사용하고 싶습니다 odd하고 even, 목록의 첫 번째 행은하지 신선한 반복으로, 여기서 마지막으로 왼쪽 오프를 데리러 선택 항목 ( oddeven)에서

예를 들어, 다음 코드에서 첫 번째 블로그에 홀수 항목이있는 경우 두 번째 블로그의 첫 번째 항목은에서 시작 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 %}

태그 cycleresetcycle(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)),
  })

참고URL : https://stackoverflow.com/questions/459161/alternate-row-coloring-in-django-template-with-more-than-one-set-of-rows

반응형