Django: Generic views based 'as_view()' method

南笙酒味 提交于 2020-08-18 11:00:25

问题


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() method as follows:

from django.conf.urls import patterns, include, url
from .views import BlogIndex

urlpatterns = patterns(
    '',
    url(r'^$', BlogIndex.as_view(), name="index"),
)

Now, I didn't really understood what the documentation had to say about this method. Can someone shed some light into this concept?


回答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



回答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



来源:https://stackoverflow.com/questions/31491028/django-generic-views-based-as-view-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!