所以這裏的答案是創建一個自定義的CBV。我已經完成了,這是ListView的一個孩子,從DateMixin和BaseDateListView類中獲得了一些靈感。代號將維持here但後人低於包括:
class ArbitraryDateListView(ListView):
date_field = None
date_format = '%Y-%m-%d'
since_date = None
until_date = None
auto_until_date = False
def get_date_field(self):
if self.date_field is None:
raise ImproperlyConfigured("%s.date_field is required." % self.__class__.__name__)
return self.date_field
def get_date_format(self):
"""
Get a date format string in strptime syntax to be used to parse the date from url variables.
"""
return self.date_format
def get_since_date(self):
"""
Return the start date for which this view should display data
"""
since_date = self.since_date
if since_date is None:
try:
since_date = self.kwargs['since']
except KeyError:
try:
since_date = self.request.GET['since']
except KeyError:
raise Http404("No since date specified")
format = self.get_date_format()
return datetime.datetime.strptime(since_date, format).date()
def get_until_date(self):
"""
Return the end date for which this view should display data
"""
until_date = self.until_date
if until_date is None:
try:
until_date = self.kwargs['until']
except KeyError:
try:
until_date = self.request.GET['until']
except KeyError:
if self.auto_until_date:
return self.get_until_date_from_since_date()
else:
raise Http404("No until date specified")
format = self.get_date_format()
return datetime.datetime.strptime(until_date, format).date()
def get_until_date_from_since_date(self):
"""
Return a calculated end date from start date when end date is not provided
"""
if self.auto_until_date:
raise NotImplementedError("If auto_util_date=True, get_until_date_from_since_date must be implemented")
def get_queryset(self):
queryset = super(ArbitraryDateListView, self).get_queryset()
date_field = self.get_date_field()
since = self.get_since_date()
until = self.get_until_date()
lookup_kwargs = {
'%s__gte' % date_field: since,
'%s__lt' % date_field: until,
}
queryset = queryset.filter(**lookup_kwargs).order_by('-%s' % date_field)
return queryset
def get_context_data(self, **kwargs):
context = {'since': self.get_since_date(),
'until': self.get_until_date()}
context.update(kwargs)
return super(ArbitraryDateListView, self).get_context_data(**context)
我愛Django的意見,而不是基於類的。 – doniyor 2014-09-24 20:55:33
日期視圖被設計爲按固定時間段分塊並支持導航鏈接,如'上個月' - 如果我使用基於類的通用視圖,我可能會使用'ListView'來完成此操作。 – 2014-09-24 21:28:11