2014-03-25 32 views
0

我試圖做一個URL設置,將顯示基於一年(而不是一個月和一天)的詳細信息頁和PK。這樣/YEAR/ISSUE/DetailView與年和pk在url

這是我曾嘗試:

我model.py:

class Mag(models.Model): 
    name = models.CharField(max_length=500) 
    issue = models.PositiveIntegerField() 
    pub_date = models.DateTimeField() 


    unique_together = ("pub_date", "issue") 

    def __unicode__(self): 
     return self.name   

    @models.permalink   
    def get_absolute_url(self): 
      creation_date = timezone.localtime(self.pub_date) 
      return ('mag_detail',(), { 
       'year': creation_date.strftime('%Y'), 
       'pk': self.issue}) 

我views.py:

class MagDetail(DateDetailView): 

    model = Mag 
    pk_url_kwarg='pk' 
    date_field='pub_date' 

我的urls.py

urlpatterns = patterns('', 
    url(r'^(?P<year>\d{4})/(?P<pk>\d+)/$', MagDetail.as_view(), name='mag_detail'), 
) 

但當我嘗試像2014/1這樣的網址時,我得到一個錯誤month is not specified

是否可以做我想要的DateDetailView,還是我需要看另一個類?

回答

2

如果你使用什麼標準DetailView並覆蓋get_object()方法,像這樣:

from django.shortcuts import get_object_or_404 

class MagDetail(DetailView): 
    model = Mag 

    def get_object(self): 

     obj = get_object_or_404(
      self.model, 
      pk=self.kwargs['pk'], 
      pub_date__year=self.kwargs['year']) 

     return obj 
+0

完美!謝謝! –

1

DateDetailView預計year/month/day

格式作爲一般的方法,如果你將使用這種說法在項目中的其他車型比單獨MAG,你可以從它雖然獲得,改變get_object方法,大致像:

class YearDetailView(DateDetailView): 
    def get_object(self, queryset=None): 
     """ 
     Get the object this request displays. 
     """ 
     year = self.get_year() 

     # Use a custom queryset if provided 
     qs = queryset or self.get_queryset() 

     if not self.get_allow_future() and int(year) > datetime.today().year: 
      raise Http404(_("Future %(verbose_name_plural)s not available because 
          %(class_name)s.allow_future is False.") % { 
           'verbose_name_plural': qs.model._meta.verbose_name_plural, 
           'class_name': self.__class__.__name__, 
          }) 

     lookup_args = {"%s__year" % self.get_date_field(): year} 
     qs = qs.filter(**lookup_args) 

     return super(BaseDetailView, self).get_object(queryset=qs) 

class MagDetail(YearDetailView): # note that we derive from our new class! 
    model = Mag 
    pk_url_kwarg='pk' 
    date_field='pub_date'