2014-09-24 5 views
0

내 Django 프로젝트에서 일부 모델 목록을 표시하고 싶습니다 (가상으로 블로그 게시물을 사용합시다). 기본적으로이 달의 게시물 목록을 표시합니다. 그러나 임의의 날짜 범위 사이에 모든 게시물을 표시하고 싶습니다.Django 클래스 기반 뷰 - 임의의 날짜 범위?

저는 첫 번째로 원하는 것을 완벽하게 충족시키는 MonthArchiveView을 보았습니다.하지만 제 생각에는 그렇게 생각하지 않습니다.

나는 또한 ArchiveIndexView (ListView와 비슷하게 보였습니까?)를보고 있었지만, 내가 원하는 것을 쉽게 할 수 있는지 확실하지 않습니다.

추천이있는 사람이 있습니까? 내장 뷰는 ​​내가 찾고있는 것을 수행 할 수 있습니까? 아니면 내 자신 만의 뷰를 작성해야합니까?

감사합니다.

+0

장고보기는 좋아하지만 클래스 기반보기는 좋아하지 않습니다. – doniyor

+0

날짜보기는 고정 된 기간으로 청크로 디자인되었으며 '지난 달'과 같은 탐색 링크를 지원합니다. 클래스 기반 제네릭보기를 사용하면이 작업을 위해'ListView '를 사용합니다. –

답변

0

여기에 대한 대답은 맞춤형 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) 
0

ListView에서 확장되는 클래스를 사용하고 해당 부모 메서드를 재정의하는 컨텍스트를 설정할 수 있습니다. 이 메서드 내에서 필요한 객체를 필터링하는 함수를 호출 할 수 있습니다. documentation에서 예를 볼 수 있습니다. 당신은 필터 당신이 원하는 날짜를 만들기 위해 그것을 몇 가지 인수를 전달할 수

def get_objects_in_some_range(self): 
     now = datetime.now() 
     current = self.filter(end_date__gte=now) 
     current = current.filter(start_date__lte=now) 
     return current 

:

또한, 일부 데이터의 날짜와 객체를 얻기 위해 내가 같은 것을 할 다양합니다.

관련 문제