여기에 대한 대답은 맞춤형 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)
장고보기는 좋아하지만 클래스 기반보기는 좋아하지 않습니다. – doniyor
날짜보기는 고정 된 기간으로 청크로 디자인되었으며 '지난 달'과 같은 탐색 링크를 지원합니다. 클래스 기반 제네릭보기를 사용하면이 작업을 위해'ListView '를 사용합니다. –