2014-04-27 4 views
0

무엇이 잘못 될지 모르지만 CBV에서 생성 된 목록을 정렬 할 수 없습니다. 나는 장고 설명서 https://docs.djangoproject.com/en/1.6/topics/class-based-views/mixins/#using-singleobjectmixin-with-listview에있는 지침을 따랐다. 이 모델은 다음과 같다 :목록보기에서 Django CBV가 작동하지 않습니다.

class Event(models.Model): 
... 
    venue = models.ForeignKey(
     'app_place.PointOfInterest', 
     related_name='events', 
     verbose_name=_('Event Place'), 
    ) 
    start = models.DateTimeField(
     default=timezone.now(), 
     verbose_name=_('Start date'), 
    ) 

    def sorted_events_set(self): 
     return self.event_set.order_by('start') 

그리고 views.py에는 다음이 포함

class PoiDetail(SingleObjectMixin, ListView): 
... 
    def get_queryset(self): 
     return self.object.events.all() 

다 잘하지만 HTML 페이지의 목록은 (그런데 반전) ID에 의해 orderd된다. 그래서 order_by를 추가했습니다.

return self.object.events.all().order_by('start') 

그러나 작동하지 않습니다 (순서는 동일하게 유지됨). 무슨 일 이니? 이것이 올바른 진행 방법이 아닌가? 또한 다른 질문에 제안 된대로 특정 순서를 모델에 추가하려고했지만 다른 오류가있어서 sorted_events_set 메서드를 사용하여 return 문을 작성하는 방법을 알지 못합니다. 도움 주셔서 감사합니다! 여기에 편집

는 전체 views.py

class PoiDetail(SingleObjectMixin, ListView): 
    template_name = 'app_place/poi.html' 

    def get(self, request, *args, **kwargs): 
     self.object = self.get_object(queryset=PointOfInterest.objects.all()) 
     return super(PoiDetail, self).get(request, *args, **kwargs) 

    def get_context_data(self, **kwargs): 
     context = super(PoiDetail, self).get_context_data(**kwargs) 
     context['poi'] = self.object 
     return context 

    def get_queryset(self): 
     return self.object.events.all().order_by('start') 

입니다 그리고 이것은 템플릿입니다 : 모든

{% for event in poi.events.all %} 
    <a href="/e20/event/{{event.id}}" class="list-group-item"> 
    <h4 class="list-group-item-heading">{{ event.title }}</h4> 
    <p class="list-group-item-text">{{event.description}}</p> 
    </a> 
{% endfor %} 
+0

전체보기 및 템플릿을 템플릿에 게시 할 수 있습니까? – knbk

+0

아마도'{poi.events.all %}의 이벤트에 대한 % {'를 {page_obj %의 이벤트에 대한 %}로 대체해야합니다. – danihp

+0

작동하지 않습니다 – Attilio

답변

1

첫째, 나는 SingleObjectMixin 혼합 권하고 싶지 않다 및 ListView. 그것들은 두 가지 목표를 위해 작성되었으며 목표를 성취하는 방식에 양립 할 수 없습니다. 이전과 같이 패치를 적용 할 수 있지만 신중하지 않으면 특히 예를 들어 super을 호출 할 때 예기치 않은 동작이 발생할 수 있습니다. 실제로는 상세보기를 만들려고하므로 DetailViewPointOfInterest으로 서브 클래 싱해야합니다.

정렬 문제 : 템플릿의 함수에 인수를 전달할 수 없으므로 뷰의 컨텍스트에서 쿼리 세트를 정렬하거나 (필수) 인수없이 함수를 만들어야합니다. 첫 번째 방법으로 이동하여 뷰 코드에서 뷰의 논리를 유지하고 도우미 메서드로 모델을 어지럽히는 것을 방지 할 수 있습니다. 어느 쪽이든, 하나의 쿼리 세트를 정렬해도 다른 쿼리 세트에는 영향을 미치지 않으므로 정확히 어떤 쿼리 세트를 사용했는지 추적해야합니다.

그래서 상황에 맞는 방법으로 이동합니다 :
class POIDetail(DetailView): 
    model = PointOfInterest 

    def get_context_data(self, **kwargs): 
     context = super(POIDetail, self).get_context_data(**kwargs) 
     context['sorted_event_list'] = self.object.events.order_by('start') 
     return context 

그리고 템플릿에

은 반복,이 {% for event in sorted_event_list %}를 사용하여.

+0

도움을 주셔서 감사합니다. 그러나 이것이 내가 원하는 해결책이 아닙니다. 첫 번째 구현은 정확히 장고 문서를 따른다. (나는 이것이 왜 권장되지 않는지 이해할 수 없다) 사실 PointOfInterest와 관련된 모든 정보와 그 장소와 관련된 이벤트를 검색 할 수 있었다. 그들을 주문하는 것). 구현을 통해 이벤트 목록이 정렬되었지만 PointOfInterest의 정보는 더 이상 사용할 수 없습니다 ... – Attilio

+0

[This is is] (https://docs.djangoproject.com/en/1.6/topics/class-based- views/mixins/# avoid-anything-more-complex).문서가이 예제를 제공하는지는 몰랐지만 질문에서 보듯이'SingleObjectMixin'과'MultipleObjectMixin'을 혼합하면 일반적으로 복잡성이 증가하고 그 예보다 더 많은 작업을 수행 할 때 불필요한 문제가 발생합니다. 템플릿 컨텍스트는'pointOfInterest' 객체를'pointofinterest'와'object' 둘 다 포함해야합니다. 그래서 확실히 사용할 수 있어야합니다. 'context_object_name'을 클래스 속성으로 오버라이드하여 자신의 컨텍스트 이름을 제공 할 수도 있습니다. – knbk

+0

빙고 !!! 그것은 누락 된 조각이었습니다 ...'pointofinterest'는'PointOfInterest'에 접근하는 올바른 방법입니다. 감사. – Attilio

관련 문제