Warlock
Warlock

Reputation: 186

Django class-based view

Django

Following the official documentation, I am creating a Django app (the same poll app as in the documentation page). While using the class-based view, I got a error. I did not understand much about class based view, for instance, may someone explain, what is the difference between a class based view from a normal view?

Here's my code:

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

Upvotes: 2

Views: 4268

Answers (3)

Kalpesh Makwana
Kalpesh Makwana

Reputation: 91

When you use url for the CBV ensure that you can not use the reference of the of the url filed, so first you need to add change the as_view to as_view().

And you can use DetailView like this.,

   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

And for accessing data you need to use {{object}},

and if you want to access other fields at that time use like this {{object.fieldname}}

In CBV the template name is automatically named as per class name so you don't need to give it.

Note:Don't give class name same as DetailView,In future you will confuse.

Upvotes: 3

Burhan Khalid
Burhan Khalid

Reputation: 174708

Since you are not modifying the view functionality, to use this generic view, you can simply do this:

in your urls.py (along with other stuff):

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

Then in poll/details.html, you just need:

{{ object }}

Upvotes: 1

jpic
jpic

Reputation: 33420

as_view should be called, not referenced, according to the docs, your url should look like:

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

Note the usage of parenthesis.

Also, you should rather call your class PollDetailView to avoid confusion for code readers.

Also, the detail() method you have defined will not be called at all. So you shouldn't define it at all. Also, leave the get_queryset() method alone for the moment, try to get the basic View to work first.

Upvotes: 9

Related Questions