Django22-視圖、上下文、中間件

我們用Django開發,比如做一個博客,我們需要做一個文章列表,文章詳情頁,這種需求是比較普遍的,所以Django中提供了Class-Based Views。

有時候我們想直接渲染一個模板,不得不寫一個視圖函數

1
2
def  render_template_view(request):
     return  render(request,  '/path/to/template.html' )

其實可以用 TemplateView 可以直接寫在 urls.py 中,不需要定義一個這樣的函數。

這樣的例子還有很多,下面一一介紹:

在urls.py中使用類視圖的時候都是調用它的 .as_view() 函數

一,Base Views

1. django.views.generic.base.View

這個類是通用類的基類,其它類都是繼承自這個類,一般不會用到這個類,個人感覺用函數更簡單些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# views.py
from  django.http  import  HttpResponse
from  django.views.generic  import  View
 
class  MyView(View):
 
     def  get( self , request,  * args,  * * kwargs):
         return  HttpResponse( 'Hello, World!' )
 
# urls.py
from  django.conf.urls  import  patterns, url
 
from  myapp.views  import  MyView
 
urlpatterns  =  patterns('',
     url(r '^mine/$' , MyView.as_view(), name = 'my-view' ),
)

2. django.views.generic.base.TemplateView

 get_context_data() 函數中,可以傳一些 額外內容 到 模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# views.py
 
from  django.views.generic.base  import  TemplateView
 
from  articles.models  import  Article
 
class  HomePageView(TemplateView):
 
     template_name  =  "home.html"
 
     def  get_context_data( self * * kwargs):
         context  =  super (HomePageView,  self ).get_context_data( * * kwargs)
         context[ 'latest_articles' =  Article.objects. all ()[: 5 ]
         return  context
 
 
# urls.py
 
from  django.conf.urls  import  patterns, url
 
from  myapp.views  import  HomePageView
 
urlpatterns  =  patterns('',
     url(r '^$' , HomePageView.as_view(), name = 'home' ),
)

3. django.views.generic.base.RedirectView

用來進行跳轉, 默認是永久重定向(301),可以直接在urls.py中使用,非常方便:

1
2
3
4
5
6
7
from  django.conf.urls  import  patterns, url
from  django.views.generic.base  import  RedirectView
 
urlpatterns  =  patterns('',
     url(r '^go-to-django/$' , RedirectView.as_view(url = 'http://djangoproject.com' ), name = 'go-to-django' ),
     url(r '^go-to-ziqiangxuetang/$' , RedirectView.as_view(url = 'http://www.ziqiangxuetang.com' ,permant = False ), name = 'go-to-zqxt' ),
)

其它的使用方式:(new in Django1.6)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# views.py
from  django.shortcuts  import  get_object_or_404
from  django.views.generic.base  import  RedirectView
 
from  articles.models  import  Article
 
class  ArticleCounterRedirectView(RedirectView):
 
     url  =  # 要跳轉的網址,
     # url 可以不給,用 pattern_name 和 get_redirect_url() 函數 來解析到要跳轉的網址
     
     permanent  =  False  #是否爲永久重定向, 默認爲 True
     query_string  =  True  # 是否傳遞GET的參數到跳轉網址,True時會傳遞,默認爲 False
     pattern_name  =  'article-detail'  # 用來跳轉的 URL, 看下面的 get_redirect_url() 函數
 
     
     # 如果url沒有設定,此函數就會嘗試用pattern_name和從網址中捕捉的參數來獲取對應網址
     # 即 reverse(pattern_name, args) 得到相應的網址,
     # 在這個例子中是一個文章的點擊數鏈接,點擊後文章瀏覽次數加1,再跳轉到真正的文章頁面
     def  get_redirect_url( self * args,  * * kwargs):
          If url  is  not  set , get_redirect_url() tries to reverse the pattern_name using what was captured  in  the URL (both named  and  unnamed groups are used).
         article  =  get_object_or_404(Article, pk = kwargs[ 'pk' ])
         article.update_counter()  # 更新文章點擊數,在models.py中實現
         return  super (ArticleCounterRedirectView,  self ).get_redirect_url( * args,  * * kwargs)
 
 
# urls.py
from  django.conf.urls  import  patterns, url
from  django.views.generic.base  import  RedirectView
 
from  article.views  import  ArticleCounterRedirectView, ArticleDetail
 
urlpatterns  =  patterns('',
 
     url(r '^counter/(?P<pk>\d+)/$' , ArticleCounterRedirectView.as_view(), name = 'article-counter' ),
     url(r '^details/(?P<pk>\d+)/$' , ArticleDetail.as_view(), name = 'article-detail' ),
)


二,Generic Display View (通用顯示視圖)

1. django.views.generic.detail.DetailView

DetailView 有以下方法:

  1. dispatch()

  2. http_method_not_allowed()

  3. get_template_names()

  4. get_slug_field()

  5. get_queryset()

  6. get_object()

  7. get_context_object_name()

  8. get_context_data()

  9. get()

  10. render_to_response()

render_to_response()

1
2
3
4
5
6
7
8
9
10
11
12
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
14
15
相關文章
相關標籤/搜索