Skip to content Skip to sidebar Skip to footer

Django: Generic Views Based 'as_view()' Method

I was working on an application wherein I created a generic ListView. Now, while defining that view in my urls.py, I read from the documentation that I need to use the as_view() me

Solution 1:

In Class-based views, you have to call as_view() function so as to return a callable view that takes a request and returns a response.Its the main entry-point in request-response cycle in case of generic views.

as_view is the function(class method) which will connect my MyView class with its url.

From django docs:

classmethod as_view(**initkwargs) Returns a callable view that takes a request and returns a response:

You just can't use class-based views like you could in normal function-based views.

BlogIndex(request) # can't do this in case of CBVs

The above code is not valid if you want the CBVs to function properly. For that, you need to provide a view which is callable and then pass request to it. For example:

response = MyView.as_view()(request)  # valid way

By calling the as_view() function on my view class MyView will give me a view which i will call with request parameter to initiate the request-response cycle.

In your case:

my_callable_view = BlogIndex.as_view() # returns a callable view
<function blog.views.BlogIndex>

Now, call this function and pass the request.

response = my_callable_view(request) # generate proper response

Solution 2:

view function have different format than before because :

  1. This view will actually be implemented as a class
  2. We will be inheriting from an existing generic view function that already does most of what we want this view function to do, rather than writing our own from scratch.
  3. Class method as_view()- this does all the work of creating an instance of the class, and making sure that the right handler methods are called for incoming HTTP requests.

ref : https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views

Solution 3:

Maybe I can try to write the as_view with pseudo-code:

classViewClass():#other stuffdefas_view(self):
           returnself.render(*args)

It return the render function inside the CBV. So it actually is the same as path('some_path',views.some_view_function,name='some_name') Of course, there there is actually much more things going on than only render function, for example to verify and save the content inside post queryDict, actually you need def post(): to handle the post, in function you just if request.method == 'POST' they are actually mutual. To be specific, as_view() just generate a overall function, including if request.method =='POST': #some code Maybe the actual code doesn't work like that, but you could understand it this way if you are not prepared to contribute to django source code yourself.

Post a Comment for "Django: Generic Views Based 'as_view()' Method"