一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Django 通用視圖

 小飛苑 2017-01-08

我們用Django開(kāi)發(fā),比如做一個(gè)博客,我們需要做一個(gè)博文列表,需要分頁(yè),這樣我們需要計(jì)算出一共有多少篇文章,根據(jù)每頁(yè)顯示的博文數(shù)量,我們從數(shù)據(jù)庫(kù)是顯示出相應(yīng)的頁(yè)對(duì)應(yīng)的文章,這樣使用數(shù)據(jù)庫(kù)的查詢可以實(shí)現(xiàn),但是這種需求是比較普遍的,所以Django中有更簡(jiǎn)單的方法來(lái)實(shí)現(xiàn),最簡(jiǎn)單的方法就是使用 generic 類(lèi)來(lái)做。

有時(shí)候我們想將一個(gè)模板直接顯示出來(lái),還不得不寫(xiě)一個(gè)視圖函數(shù),其實(shí)可以用 TemplateView 可以直接寫(xiě)在 urls.py 中,這樣的例子還有很多,下面一一介紹:

在urls.py中使用類(lèi)視圖的時(shí)候都是調(diào)用它的 .as_view() 函數(shù)

一,Base Views

1. django.views.generic.base.View

這個(gè)類(lèi)是通用類(lèi)的基類(lèi),其它類(lèi)都是繼承自這個(gè)類(lèi),一般不會(huì)用到這個(gè)類(lèi),個(gè)人感覺(jué)用函數(shù)更簡(jiǎn)單些。

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() 函數(shù)中,可以傳一些 額外內(nèi)容 到 模板

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

用來(lái)進(jìn)行跳轉(zhuǎn), 默認(rèn)是永久重定向(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://'), name='go-to-django'),
    url(r'^go-to-ziqiangxuetang/$', RedirectView.as_view(url='http://www.',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 = # 要跳轉(zhuǎn)的網(wǎng)址,
    # url 可以不給,用 pattern_name 和 get_redirect_url() 函數(shù) 來(lái)解析到要跳轉(zhuǎn)的網(wǎng)址
     
    permanent = False #是否為永久重定向, 默認(rèn)為 True
    query_string = True # 是否傳遞GET的參數(shù)到跳轉(zhuǎn)網(wǎng)址,True時(shí)會(huì)傳遞,默認(rèn)為 False
    pattern_name = 'article-detail' # 用來(lái)跳轉(zhuǎn)的 URL, 看下面的 get_redirect_url() 函數(shù)
     
    # 如果url沒(méi)有設(shè)定,此函數(shù)就會(huì)嘗試用pattern_name和從網(wǎng)址中捕捉的參數(shù)來(lái)獲取對(duì)應(yīng)網(wǎng)址
    # 即 reverse(pattern_name, args) 得到相應(yīng)的網(wǎng)址,
    # 在這個(gè)例子中是一個(gè)文章的點(diǎn)擊數(shù)鏈接,點(diǎn)擊后文章瀏覽次數(shù)加1,再跳轉(zhuǎn)到真正的文章頁(yè)面
    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() # 更新文章點(diǎn)擊數(shù),在models.py中實(shí)現(xiàn)
        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()

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
# views.py
from django.views.generic.detail import DetailView
from django.utils import timezone
from articles.models import Article
class ArticleDetailView(DetailView):
    model = Article # 要顯示詳情內(nèi)容的類(lèi)
     
    template_name = 'article_detail.html' 
    # 模板名稱(chēng),默認(rèn)為 應(yīng)用名/類(lèi)名_detail.html(即 app/modelname_detail.html)
    # 在 get_context_data() 函數(shù)中可以用于傳遞一些額外的內(nèi)容到網(wǎng)頁(yè)
    def get_context_data(self**kwargs):
        context = super(ArticleDetailView, self).get_context_data(**kwargs)
        context['now'= timezone.now()
        return context
         
         
# urls.py
from django.conf.urls import url
from article.views import ArticleDetailView
urlpatterns = [
    url(r'^(?P<slug>[-_\w]+)/$', ArticleDetailView.as_view(), name='article-detail'),
]

article_detail.html

1
2
3
4
5
6
7
<h1>標(biāo)題:{{ object.title }}</h1>
<p>內(nèi)容:{{ object.content }}</p>
<p>發(fā)表人: {{ object.reporter }}</p>
<p>發(fā)表于: {{ object.pub_date|date }}</p>
<p>日期: {{ now|date }}</p>


2. django.views.generic.list.ListView

ListView 有以下方法:

  1. dispatch()

  2. http_method_not_allowed()

  3. get_template_names()

  4. get_queryset()

  5. get_context_object_name()

  6. get_context_data()

  7. get()

  8. render_to_response()

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
# views.py
from django.views.generic.list import ListView
from django.utils import timezone
from articles.models import Article
class ArticleListView(ListView):
    model = Article
    def get_context_data(self**kwargs):
        context = super(ArticleListView, self).get_context_data(**kwargs)
        context['now'= timezone.now()
        return context
# urls.py:
from django.conf.urls import url
from article.views import ArticleListView
urlpatterns = [
    url(r'^$', ArticleListView.as_view(), name='article-list'),
]

article_list.html

1
2
3
4
5
6
7
8
<h1>文章列表</h1>
<ul>
{% for article in object_list %}
    <li>{{ article.pub_date|date }} - {{ article.headline }}</li>
{% empty %}
    <li>抱歉,目前還沒(méi)有文章。</li>
{% endfor %}
</ul>

未完待續(xù)


Class-based views 官方文檔: 

https://docs./en/dev/ref/class-based-views/#built-in-class-based-views-api

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    亚洲综合色在线视频香蕉视频| 欧美日韩精品一区二区三区不卡| 国产成人国产精品国产三级| 欧美熟妇喷浆一区二区| 国产av一区二区三区久久不卡| 日韩色婷婷综合在线观看| 在线精品首页中文字幕亚洲 | 国产精欧美一区二区三区久久| 日韩三级黄色大片免费观看| 爱在午夜降临前在线观看| 久久精品欧美一区二区三不卡| 九九视频通过这里有精品| 日韩性生活片免费观看| 欧美一区二区三区喷汁尤物| 精品国产丝袜一区二区| 一本久道久久综合中文字幕| 精品一区二区三区三级视频| 91偷拍裸体一区二区三区| 东京热男人的天堂社区| 午夜福利视频偷拍91| 三级理论午夜福利在线看| 国产一区二区三区午夜精品 | 青青久久亚洲婷婷中文网| 少妇淫真视频一区二区| 91人妻人人做人碰人人九色| 欧美日韩黑人免费观看| 日韩精品一级片免费看| 少妇淫真视频一区二区| 国产亚洲精品久久99| 久久精品中文字幕人妻中文| 日韩欧美综合在线播放| 亚洲综合香蕉在线视频| av中文字幕一区二区三区在线| 久久亚洲午夜精品毛片| 国产一区二区不卡在线播放| 一级欧美一级欧美在线播| 欧美午夜一级艳片免费看| 国产午夜精品在线免费看| 免费国产成人性生活生活片| 殴美女美女大码性淫生活在线播放 | 精品国产日韩一区三区|