2017-11-17 2 views
1

나는 다음과 같은 모델이 내 EventsIndex 템플릿에서장고 | 월별로 그룹화 된 이벤트를 사용자 정의 형식으로 표시 하시겠습니까?

class Event(Page) 
    # my fields 
    start_date = models.DateField() 
    end_date = models.DateField() 

class EventsIndex(Page): 
    # my fields 

    def get_events(self): 
     events = Event.objects.all().sort_by("start_date") 
     return events 

그때 옆에 후 월 현재 달, 다음 달을 보여 4 개 탭이를 표시해야하는 "나중에"라는 마지막 탭 월별로 그룹화 개별 Event의 :

enter image description here

나는 이러한 이벤트가 표시 취득하는 논리를 알아 내려고 노력하고있어. 개별 월 탭에는 이벤트 만 표시되는 반면, '나중에'탭에는 이벤트 월의 제목과 이벤트 자체가 표시되어야합니다. 처음에는 각 탭에 대한 함수를 만드는 방법을 생각했습니다.

def current_month_events(self): 
    current_month, current_year = datetime.now().month, datetime.now().year 
    events = Event.objects.filter(start_date__year=current_year, 
        start_date__month=current_month).order_by("start_date") 
    return events 

# Repeat for all required tabs 

그러나 이것은 DRY 원칙을 위반하는 것 같습니다. 이 논리를 처리하는 더 평범한 방법이 있습니까?

답변

1

저는 장고에서 이런 유형의 지원이 부족하다는 점에 대해 항상 짜증이났습니다.

aggregation을 수행하지 않는 한 그다지 잘 지원되지 않습니다.

내가 할 수있는 가장 파이 톤/Djangorrific 방법 is in the template, using groupby there. (이 템플릿에서 비즈니스 로직을 넣어하지의 개념에 갈 날 것으로 보인다,하지만 당신은 거기에 있습니다.) 귀하의 경우에는

, 당신은 views.py 파일 같은 것을 할 것 :

from datetime import date, timedelta 
today = date.today() 
four_months_time = today + timedelta(months=4) 
events = Event.objects.filter(start_date__gte=today, start_date__lte= 
        four_months_time).order_by("start_date")` 
이 안된

{% regroup events by start_date.month as events_list %} 
<ul> 
{% for event in events_list %} 
    <li>{{ event.grouper }} 
    <ul> 
     {% for event in event.list %} 
      <li>{{event}}</li> 
     {% endfor %} 
    </ul> 
    </li> 
{% endfor %} 
</ul> 

하지만, 올바른 방향에 당신을 보내야 :

및 템플릿에 (다시 events 변수로 전달할 가정)!

+0

Nailed it, thanks @Withnail! 나는 시간 델타 대신에 relativedelta를 사용하는 것과 같은 약간의 변경을해야했다. 그러나 그것은 완벽하게 작동한다. :) – DDiran