2

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')
4

3 回答 3

9

as_view根据文档,应该调用而不是引用,您的 url 应该如下所示:

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

注意括号的用法。

此外,您更应该调用您的类PollDetailView以避免代码阅读器混淆。

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

于 2013-07-04T11:47:52.800 回答
3

当您将 url 用于 CBV 时,请确保您不能使用 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一样,以后会混淆。

于 2020-02-03T11:40:13.250 回答
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 }}
于 2013-07-04T11:57:32.830 回答