2017-03-08 10 views
1

をDATE_FIELD:Djangoの日付ベースArchiveViewが、私は特定の日にこれらの場所に場所や訪問を記述したDjangoのモデル持っ

from django.db import models 

class Place(models.Model): 
    # ... 
    name = models.CharField(max_length=255) 

class Visit(models.Model): 
    # ... 
    place = models.ForeignKey('Place', blank=False) 
    visit_date = models.DateField(blank=False) 

を私は年に訪問したすべての場所を表示したいので、私はしました訪問との関係をまたがるdate_fieldYearArchiveViewを使用してみました:

from django.views.generic import YearArchiveView 
from myapp.models import Place 

class PlaceYearArchiveView(YearArchiveView): 
    date_field = 'visit__visit_date' 
    model = Place 

しかし、これは「場所 『はvisit__visit_date』という名前のフィールドを持っていない」私を取得します。このビューは(d1d2が問題の年の最初と最後の日と仮定)このようなものだクエリセットを使用していする最も簡単な方法は何

Place.objects.filter(visit__visit_date__gte=d1, visit__visit_date__lte=d2).distinct() 

私は標準ListViewを使用することができますし、私自身のget_queryset()メソッドを書きますが、もしこれがより良いと思われるYearArchiveViewに基づいています。

+0

は' placeset__visit__visit_date'仕事をしていますか? – Tom

+0

いいえ、同様の結果です。私は前にフィルターで 'placeset__'スタイルを見ていませんでした。 –

+0

また試してみてください: 'Place.objects.filter(visit__visit_date__ear = 2016).distinct()' – Udi

答えて

1

ListViewは、通常、日付階層にはYearArchiveViewが使用されています。その場合、次のレベルはPlaceです。

YearArchiveViewを使用する場合は、... mmm ...少し再生する必要があります。以下に2つのオプションがあります。

(いくつかの小さな変更後)は、次の訪問のモデルと仮定:

class Visit(models.Model): 
    place = models.ForeignKey(Place, related_name='visits') 
    date = models.DateField() 

オプション1:使用regroupテンプレートタグ:

views.py

class PlaceYearArchiveView(YearArchiveView): 
    date_field = 'date' 
    model = models.Visit 
    make_object_list = True 
    ordering = ('place', 'date') 

visit_archive_year.html

<h1>{{ year.year }}</h1> 
<ul> 
    {% regroup object_list by place as grouped %} 
    {% for group in grouped %} 
     <li> 
      {{ group.grouper.name }} 
      ({% for visit in group.list %}{{ visit.date }}{% if not forloop.last %}, {% endif %}{% endfor %}) 
     </li> 
    {% endfor %} 
</ul> 

オプション2: `get_dated_items(修正)」

views.py

class PlaceYearArchiveView(YearArchiveView): 
    date_field = 'date' 
    make_object_list = True 
    model = models.Visit 
    ordering = 'place' 

    def get_dated_items(self): 
     items, qs, info = super().get_dated_items() 
     return items, qs.distinct('place'), info 

visit_archive_year.html

<h1>{{ year.year }}</h1> 
<ul> 
    {% for v in object_list %} 
     <li>@{{ v.date }}: {{ v.place.name }}</li> 
    {% endfor %} 
</ul> 
+0

この@Udiに答える時間をとってくれてありがとう。これらは両方とも、私が欲しいことをするためのやや異なった方法としてOKになります。 'YearArchiveView'を使用して、コンテキスト内に' next_year'、 'previous_year'などの値があるようにしたいと思います。私は 'make_object_list'も見落としてしまいました。これはかなり重要です! –

関連する問題