我們用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() 函數
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'
),
)
|
1. django.views.generic.detail.DetailView
DetailView 有以下方法:
get()
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
|