Django基于类的视图

时间:2013-07-04 11:45:17

标签: python django django-class-based-views

django的

我是django的新手。按照doc我正在创建一个django应用程序。当我使用基于类的视图时,我收到了一个错误。 我对基于类的视图了解不多。任何人都可以解释普通视图之间的区别。它是Django文档页面中相同的民意调查应用程序

这是我的代码:

class DetailView(generic.DetailView):
    model = Poll
    template_name = 'polls/details.html'
    def get_queryset(self):

    def detail(request, poll_id):
        try:
            poll = Poll.objects.get(pk=poll_id)
        except Poll.DoesNotExist:
            raise Http404
        return render(request, 'polls/details.html', {'poll': poll})

*********************Error ********************
TypeError at /polls/2/results/
as_view() takes exactly 1 argument (3 given)
Request Method: GET
Request URL:    <app-path>/polls/2/results/
Django Version: 1.5.1
Exception Type: TypeError
Exception Value:    
as_view() takes exactly 1 argument (3 given)    

*****the url***
 url(r'^(?P<pk>\d+)/$', views.DetailView.as_view, name='detail')

3 个答案:

答案 0 :(得分:9)

根据{{​​3}},

as_view应该被调用,而不是引用,您的网址应如下所示:

url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail')

请注意括号的用法。

另外,您应该打电话给您的班级PollDetailView,以避免代码阅读器混淆。

此外,您定义的detail()方法根本不会被调用。所以你根本不应该定义它。此外,暂时不使用get_queryset()方法,尝试使基本视图首先工作。

答案 1 :(得分:3)

在将CBV使用url时,请确保不能使用该url的引用,因此首先需要添加将as_view更改为 as_view()

您可以像这样使用DetailView。

   class PollDetail(DetailView):
   model=Book

   def get_context_data(self,*args,**kwargs):                    
       context=super(PollDetail,self).get_context_data(*args,**kwargs)
       print(context) #It will give you the data in your terminal
       return context

要访问数据,您需要使用 {{object}}

,如果您当时想访问其他字段,请使用 {{object.fieldname}}

在CBV中,模板名称是根据类名称自动命名的,因此您无需提供它。

注意:请勿提供与DetailView相同的类名,以后您会感到困惑。

答案 2 :(得分:1)

由于您没有修改视图功能,因此要使用此通用视图,您只需执行以下操作:

在您的urls.py(以及其他内容)中:

from django.views.generic.detail import DetailView
from poll.models import Poll

url(r'^(?P<pk>\d+)/$',
    DetailView.as_view(model=Poll,
                       template_name='polls/details.html'), name='detail')

然后在poll/details.html,你只需要:

{{ object }}