Django 基于類的通用視圖

django

在早期蛋逾,我們認(rèn)識(shí)到在視圖開發(fā)過程中有共同的用法和模式。這時(shí)我們引入基于函數(shù)的通用視圖來抽象這些模式以簡化常見情形的視圖開發(fā)懊悯。

基于函數(shù)視圖的用法有以下三種:

def index(request):
    return HttpResponse('hello world!')

def index(request):
    result = {'demo':'demo'}
    return render(request, 'blog/about.html', result)

def index(request):
    result = {'demo':'demo'}
    return render_to_response('blog/about.html', result)

基于函數(shù)的視圖的問題在于蜓谋,雖然它們很好地覆蓋了簡單的情形,但是不能擴(kuò)展或自定義它們炭分,即使是一些簡單的配置選項(xiàng)桃焕,這讓它們?cè)诂F(xiàn)實(shí)應(yīng)用中受到很多限制∨趺基于類的通用視圖然后應(yīng)運(yùn)而生观堂,目的與基于函數(shù)的通用視圖一樣,就是為了使得視圖的開發(fā)更加容易呀忧。

下面三個(gè)是最常使用的基于類的通用視圖:

TemplateView师痕,ListView,DetailView

TemplateView

TemplateView 一般只在需要返回模板時(shí)使用而账。

class ProtectView(TemplateView):
    template_name = 'polls/name.html'  

TemplateView 可以方便的定義要返回的模板但它不能把數(shù)據(jù)庫中的內(nèi)容查詢展示出來胰坟,所以需要使用 DetailViewListView

所有基于類的通用視圖中定義的方法需要在類視圖調(diào)用 as_view() 方法后會(huì)被自動(dòng)調(diào)用泞辐,因?yàn)?DjangoURL 解析器將請(qǐng)求和關(guān)聯(lián)的參數(shù)發(fā)送給一個(gè)可調(diào)用的函數(shù)而不是一個(gè)類笔横,所以基于類的視圖有一個(gè) as_view() 類方法用來作為類的可調(diào)用入口。

ListView

ListView 用于獲取存儲(chǔ)在數(shù)據(jù)庫中的某個(gè) Model 的列表咐吼。

class IndexView(ListView):  
    """
        首頁視圖函數(shù)吹缔,繼承 ListView ,展示從數(shù)據(jù)庫中獲取的文章列表   
    """
    template_name = "blog/index.html"
    context_object_name = "article_list"
    model = Article

template_name 屬性指定了需要渲染的模板锯茄,context_object_name 指定了模板中使用的上下文變量厢塘,model 指定了數(shù)據(jù)的來源。它的功能相當(dāng)于取出了 modelArticle 的所有數(shù)據(jù)肌幽,使用變量 article_list 傳遞給了 blog/index.html 模板晚碾。ListView 中默認(rèn)使用 object_list 作為上下文變量,可以使用 context_object_name 來自定義上下文變量牍颈,一般使用默認(rèn)的對(duì)模板設(shè)計(jì)者不友好迄薄,所以都是自定義上下文變量的。model 屬性指定了要獲取表中的所有數(shù)據(jù)煮岁,它的功能相當(dāng)于 article_list = Article.objects.all()讥蔽,但是當(dāng)你需要使用過濾條件或者對(duì)數(shù)據(jù)進(jìn)行一定的操作時(shí),則需要重寫 ListView 中獲取數(shù)據(jù)的方法(get_queryset 方法)画机,像下面這樣:

class IndexView(ListView):  
    """
        首頁視圖函數(shù)冶伞,繼承 ListView ,展示從數(shù)據(jù)庫中獲取的文章列表   
    """
    template_name = "blog/index.html"
    context_object_name = "article_list"

    def get_queryset(self):
        """
            重寫 get_queryset 方法步氏,取出發(fā)表的文章并轉(zhuǎn)換文章格式
        """
        article_list = Article.objects.filter(status='p')
        for article in article_list:
            article.body = markdown2.markdown(article.body, extras=['fenced-code-blocks'], )
        return article_list

    def get_context_data(self, **kwargs):
        kwargs['category_list'] = Category.objects.all().order_by('name')
        return super(IndexView, self).get_context_data(**kwargs)

此次重寫了 get_context_data 方法响禽,這個(gè)方法是用來添加額外的內(nèi)容傳遞到模板文件的上下文對(duì)象(context)中。上面的例子中將 category_list 添加到上下文變量中荚醒,則在模板中可以使用 {{ }} 來展示 category_list 中的內(nèi)容芋类。

ListView 主要用來獲取某個(gè) model 中的所有數(shù)據(jù),通過 template_name 屬性來指定需要渲染的模板,通過 context_object_name 屬性來指定上下文變量(默認(rèn)為 object_list)界阁,通過重寫 get_queryset 方法來對(duì) model 中的數(shù)據(jù)增加其他邏輯,通過重寫 get_context_data 方法來為上下文對(duì)象添加額外的對(duì)象侯繁。

DetailView

ListView 用來獲取某個(gè) model 中的所有數(shù)據(jù),而 DetailView 則是獲取每個(gè)數(shù)據(jù)的詳細(xì)信息泡躯,比如 ListView 獲取所有文章列表贮竟,DetailView 用來獲取文章的詳細(xì)信息。

class ArticleDetailView(DetailView):
    """
        文章詳情頁
    """

    model = Article
    template_name = 'blog/detail.html'
    context_object_name = "article"
    # 在 urlpattern 中定義的
    pk_url_kwarg = 'article_id'
    
    def get_object(self, queryset=None):
        """ 
            獲取對(duì)應(yīng)文章的信息
        """
        obj = super(ArticleDetailView, self).get_object()
        obj.body = markdown2.markdown(obj.body, extras=['fenced-code-blocks'], )
        return obj 

    # 增加 form 到 context
    def get_context_data(self, **kwargs):
        kwargs['comment_list'] = self.object.blogcomment_set.all()  #獲取評(píng)論
        return super(ArticleDetailView, self).get_context_data(**kwargs)

pk_url_kwarg 定義用來獲取對(duì)應(yīng)的單條數(shù)據(jù)较剃,需要傳遞主鍵的值咕别。get_object 方法獲取 pk_url_kwarg 中所要查找的對(duì)象,類似于 ListView 中的 get_queryset 方法写穴,get_context_data 方法和 ListView 中的功能相同惰拱。

DetailView 主要用在獲取某個(gè) model 的單個(gè)對(duì)象中,需要在 URL 中傳遞一個(gè)主鍵值進(jìn)行查詢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啊送,一起剝皮案震驚了整個(gè)濱河市弓颈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌删掀,老刑警劉巖翔冀,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異披泪,居然都是意外死亡纤子,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門款票,熙熙樓的掌柜王于貴愁眉苦臉地迎上來控硼,“玉大人,你說我怎么就攤上這事艾少】ㄇ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵缚够,是天一觀的道長幔妨。 經(jīng)常有香客問我鹦赎,道長,這世上最難降的妖魔是什么误堡? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任古话,我火速辦了婚禮,結(jié)果婚禮上锁施,老公的妹妹穿的比我還像新娘陪踩。我一直安慰自己,他們只是感情好悉抵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布肩狂。 她就那樣靜靜地躺著,像睡著了一般姥饰。 火紅的嫁衣襯著肌膚如雪傻谁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天媳否,我揣著相機(jī)與錄音栅螟,去河邊找鬼。 笑死篱竭,一個(gè)胖子當(dāng)著我的面吹牛力图,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掺逼,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吃媒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了吕喘?” 一聲冷哼從身側(cè)響起赘那,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氯质,沒想到半個(gè)月后募舟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闻察,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年拱礁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辕漂。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呢灶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钉嘹,到底是詐尸還是另有隱情鸯乃,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布跋涣,位于F島的核電站缨睡,受9級(jí)特大地震影響鸟悴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宏蛉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一遣臼、第九天 我趴在偏房一處隱蔽的房頂上張望性置。 院中可真熱鬧拾并,春花似錦、人聲如沸鹏浅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隐砸。三九已至之碗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間季希,已是汗流浹背褪那。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留式塌,地道東北人博敬。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像峰尝,于是被迫代替她去往敵國和親偏窝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 基于類的視圖 Django中的視圖是一個(gè)可調(diào)用對(duì)象武学,它接收一個(gè)請(qǐng)求然后返回一個(gè)響應(yīng)祭往。這個(gè)可調(diào)用對(duì)象不僅僅限于函數(shù),...
    蘭山小亭閱讀 4,577評(píng)論 1 13
  • 本教程內(nèi)容已過時(shí)火窒,更新版教程請(qǐng)?jiān)L問: Django 博客開發(fā)入門教程硼补。 通過三周的時(shí)間我們開發(fā)了一個(gè)簡單的個(gè)人 B...
    追夢(mèng)人物閱讀 6,856評(píng)論 6 14
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,111評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)熏矿,斷路器已骇,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 作為投資者,預(yù)估產(chǎn)品是否有價(jià)值曲掰,以及預(yù)測(cè)產(chǎn)品的未來疾捍,是一項(xiàng)基本的技能。 就現(xiàn)在被炒熱起來的以特幣來說栏妖,他的價(jià)值在哪...
    老周_1872閱讀 264評(píng)論 0 0