2017-11-17 5 views
1

私は次のモデルがあります:Django |月ごとにグループ化されたイベントをカスタム形式で表示しますか?

私はその後、4月現在表示し、タブ、来月、次の後の月と表示されるはず「その後」と呼ばれる最後のタブを持っている私の 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 

月ごとにグループ化された個々のEvent S:

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原則に反するように思われます。このロジックを処理するためのもっとpythonicな方法はありますか?

答えて

1

私はいつもDjangoでこのタイプのものがサポートされていないということについて、とても腹が立っています。

aggregationを実行していない限り、それほどうまくサポートされていません。

私が見つけることができる最もpythonic/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")` 

とテンプレートで(あなたが戻ってevents変数として渡すと仮定した場合):

{% 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> 

これは未テストですが、正しい方向にあなたを送信する必要があります!

+0

ありがとう@Withnail!私は、時間デルタの代わりにrelativedeltaを使用するなど、いくつかの変更を加えなければならなかったが、すべてが完璧に機能する:) – DDiran

関連する問題