2013-01-08 27 views
0

我不想在使用Django的dated_based generic views時在詳細信息視圖的URL中有一天。我嘗試以下,但得到了TypeError at /logbook/2013/january/testing/ object_detail() takes at least 6 arguments (7 given)從Django的date_based通用視圖中省略日關鍵字參數?

models.py

class Entry(models.Model): 
    pub_date = models.DateTimeField() 

def get_absolute_url(self): 
    return "/logbook/%s/%s/" % (self.pub_date.strftime("%Y/%B").lower(), self.slug) 

urls.py:

from __future__ import absolute_import 
from django.conf.urls import patterns, include, url 

from .models import Entry 
from . import views 

urlpatterns += patterns('', 
    url(r'^logbook/(?P<year>\d{4})/(?P<month>[A-Za-z]+)/(?P<slug>[\w-]+)/$', 
    views.entry_detail), 
) 

views.py:

import functools 
from django.views.generic import date_based 

from .models import Entry 

def prepare_arguments(view): 
    @functools.wraps(view) 
    def wrapped(request, *args, **kwargs): 
     kwargs['allow_future'] = request.user.is_staff 
     kwargs['queryset'] = Entry.objects.all() if request.user.is_staff 
     else Entry.objects.published() 
     kwargs['date_field'] = 'pub_date' 
     return view(request, *args, **kwargs) 
    return wrapped 

@prepare_arguments 
def entry_detail(request, *args, **kwargs): 
    return date_based.object_detail(request, *args, **kwargs) 

是否可以修改上面的代碼並繼續使用date_based的通用視圖,而無需在URL中使用一天?如果沒有,請問有人可以舉一個簡單的自定義視圖的例子來說明URL模式url(r'^logbook/(?P<year>\d{4})/(?P<month>[A-Za-z]+)/(?P<slug>[\w-]+)/$', views.entry_detail)

+0

如果你想定製通用視圖,你可能發現它更容易移動到基於類的視圖,在這種情況下['DateDetailView'](https://docs.djangoproject.com/en/dev/ref/class-based-views/generic-date-based/#datedetailview) 。 – Alasdair

+0

DateDetailView [仍然需要一天關鍵字參數](https://code.djangoproject.com/ticket/17508)。我想我必須寫出自己的觀點。 – sgriffee

+1

我並沒有試圖建議'DateDetailView'能夠解決這個問題,只是因爲你可以重寫個別方法,所以定製會更容易。我會從重寫'get_object()'開始,看看會發生什麼。 – Alasdair

回答

0

感謝Alasdair指引我在正確的方向和ccbv.co.uk。最後我用DetailView和這工作:

urls.py:

from django.views.generic import DetailView 

urlpatterns += patterns('', 
    url(r'^logbook/(?P<year>\d+)/(?P<month>[-\w]+)/(?P<slug>[\w-]+)/$', 
     DetailView.as_view(model=Entry), 
     name="entry_detail"), 
) 

views.py:

# nothing needed here for the detail view to work, though in the future 
# I would like to have the generic view code here instead to accomplish 
# the same thing as `DetailView.as_view(model=Entry), name="entry_detail"` 
# in urls.py, and would appreciate an example of this.