[python] Django 템플릿에서 관련 항목 정렬

DJango 템플릿에서 관련 항목 세트를 정렬 할 수 있습니까?

즉,이 코드 (명확성을 위해 HTML 태그가 생략 됨) :

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

내가 원하는 거의 정확하게 표시합니다 . 내가 변경하고 싶은 유일한 것은 성으로 정렬 할 참석자 목록입니다. 나는 다음과 같이 말하려고 시도했습니다.

{% for event in events %}
   {{ event.location }}
   {% for attendee in event.attendee_set.order_by__last_name %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

아아, 위의 구문은 작동하지 않으며 (빈 목록이 생성됨) 내가 생각했던 다른 변형도 없습니다 (많은 구문 오류가보고되었지만 기쁨은 없음).

물론 내 관점에서 일종의 정렬 된 참석자 목록을 생성 할 수는 있지만 그것은 추하고 깨지기 쉬운 (그리고 추악한 것을 언급 했습니까) 해결책입니다.

말할 필요도없이, 어쨌든 나는 그것을 말할 것이다. 나는 온라인 문서를 숙독하고 도움이되는 것을 찾지 않고 Stack Overflow와 django-user의 아카이브를 검색했다 (아, 쿼리 세트 만 사전 dictsort라면 직업이지만 그렇지 않습니다)

=============================================

Tawmas의 답변을 수락 한 후 추가 생각을 추가하도록 편집되었습니다.


Tawmas는 내가 제시 한대로 문제를 정확히 해결했지만 해결책은 내가 예상 한 것과는 달랐습니다. 그 결과 다른 상황에서도 사용할 수있는 유용한 기술을 배웠습니다.

Tom의 대답은 내가 OP에서 이미 언급 한 접근 방식을 제안했고 “추악한”것으로 잠정적으로 거부했습니다.

“못생긴”은 직감 반응이었고, 나는 그것에 무엇이 잘못되었는지 명확히하고 싶었습니다. 그렇게하면서 나는 그것이 추악한 접근 방식 인 이유가 렌더링 할 템플릿에 쿼리 세트를 전달한다는 생각에 매 달렸 기 때문이라는 것을 깨달았습니다. 이 요구 사항을 완화하면 작동해야 할 추악한 접근 방식이 있습니다.

나는 아직 시도했지만 오히려 검색어 세트를 전달하는 대신, 뷰 코드는 이벤트의 다음 해당 참석자에 대한 쿼리 세트 각 이벤트 장식 목록 생성 쿼리 집합을 통해 반복한다고 가정하지 않은 WAS , 분류를 (또는 필터링 또는 무엇이든) 원하는 방식으로. 다음과 같이 :

eventCollection = []
events = Event.object.[filtered and sorted to taste]
for event in events:
   event.attendee_list = event.attendee_set.[filtered and sorted to taste]
   eventCollection.append(event)

이제 템플릿은 다음과 같습니다.

{% for event in events %}
   {{ event.location }}
   {% for attendee in event.attendee_list %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

단점은 모든 이벤트를 한 번에 “실현”해야한다는 것입니다. 이벤트가 많으면 문제가 될 수 있습니다. 물론 페이지 매김을 추가 할 수 있지만 이는보기를 상당히 복잡하게 만듭니다.

장점은 “표시 할 데이터 준비”코드가보기에 속한보기에 표시되어 표시를 위해보기에서 제공하는 데이터의 서식 지정에 템플릿이 집중할 수 있다는 것입니다. 이것은 옳고 적절합니다.

그래서 내 계획은 큰 테이블에는 Tawmas의 기술을 사용하고 작은 테이블에는 위의 기술을 사용하고 크고 작은 정의는 독자에게 맡기는 것입니다 (웃음).



답변

다음과 같이 참석자 모델에서 순서를 지정해야합니다. 예를 들어 (모델 클래스의 이름이 Attendee라고 가정) :

class Attendee(models.Model):
    class Meta:
        ordering = ['last_name']

자세한 내용 은 설명서 를 참조하십시오.

편집 . 또 다른 해결책은 템플릿에서 액세스 할 수있는 속성을 이벤트 모델에 추가하는 것입니다.

class Event(models.Model):
# ...
@property
def sorted_attendee_set(self):
    return self.attendee_set.order_by('last_name')

필요에 따라 더 많이 정의 할 수 있습니다.


답변

템플릿 필터 dictsort https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-dictsort를 사용할 수 있습니다.

이것은 작동합니다.

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all|dictsort:"last_name" %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}


답변

한 가지 해결책은 사용자 정의 templatag를 만드는 것입니다.

@register.filter
def order_by(queryset, args):
    args = [x.strip() for x in args.split(',')]
    return queryset.order_by(*args)

다음과 같이 사용하십시오.

{% for image in instance.folder.files|order_by:"original_filename" %}
   ...
{% endfor %}


답변

regroup 은 원하는 것을 할 수 있어야하지만 뷰에서 원하는 방식으로 주문할 수없는 이유가 있습니까?


답변