成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Django搭建個(gè)人博客:基于類的視圖

QiShare / 2536人閱讀

摘要:有編程基礎(chǔ)的同學(xué)都知道,類是面向?qū)ο蠹夹g(shù)中非常重要的概念。有區(qū)別的是,是作為功能添加到子類中的,而不是作為父類。首先調(diào)用父類方法,將這個(gè)對(duì)象賦值給變量,然后再對(duì)其進(jìn)行統(tǒng)計(jì)瀏覽量的操作,最后將對(duì)象返回。

說是完結(jié),馬上又開始寫進(jìn)階篇了。

本章不會(huì)為博客項(xiàng)目增加新功能,但是也同樣重要,因?yàn)槲覀円獙W(xué)習(xí)高逼格的基于的視圖。

什么是類視圖

前面章節(jié)中寫的所有視圖都是基于函數(shù)的,即def;而類視圖是基于類的,即class。

有編程基礎(chǔ)的同學(xué)都知道,是面向?qū)ο蠹夹g(shù)中非常重要的概念。具有復(fù)雜數(shù)據(jù)、功能的類,可以通過繼承輕而易舉的將自身特性傳遞給另一個(gè)類,從而實(shí)現(xiàn)代碼的高效復(fù)用。

相比以前的函數(shù)視圖,類視圖有以下優(yōu)勢(shì):

HTTP方法(GET,POST等)相關(guān)的代碼,可以通過方法而不是條件分支來組織

可以通過諸如mixins(多重繼承)之類的面向?qū)ο蠹夹g(shù)將代碼分解為可重用組件

說的都是什么意思?通過例子來感受一下。

列表 函數(shù)和類

假設(shè)我們有一個(gè)博客列表,列表既有GET方法、又有POST方法,那么用視圖函數(shù)看起來像這樣:

views.py

def article_list_example(request):
    """處理GET請(qǐng)求"""
    if request.method == "GET":
        articles = ArticlePost.objects.all()
        context = {"articles": articles}
        return render(request, "article/list.html", context)

而在類視圖中,則變?yōu)檫@樣:

views.py

from django.views import View

class ArticleListView(View):
    """處理GET請(qǐng)求"""
    def get(self, request):
        articles = ArticlePost.objects.all()
        context = {"articles": articles}
        return render(request, "article/list.html", context)

從本質(zhì)上講,基于類的視圖允許你使用不同的類實(shí)例方法(即上面的def get())響應(yīng)不同的HTTP請(qǐng)求方法,而不需要使用條件分支代碼。這樣做的好處是把不同的HTTP請(qǐng)求都分離到獨(dú)立的函數(shù)中,邏輯更加清晰,并且方便復(fù)用。

需要注意的是,因?yàn)镈jango的URL解析器希望將請(qǐng)求發(fā)送到函數(shù)而不是類,所以類視圖有一個(gè) as_view()方法,該方法返回一個(gè)函數(shù),當(dāng)請(qǐng)求匹配關(guān)聯(lián)模式的URL時(shí),則調(diào)用該函數(shù)。

即,視圖函數(shù)的url原本寫為:

urls.py

...
urlpatterns = [
    path("...", views.article_list_example, name="..."),
]

類視圖的url需改寫為:

urls.py

...
urlpatterns = [
    path("...", views.ArticleListView.as_view(), name="..."),
]
通用視圖

列表這樣的功能在web開發(fā)中是很常見的,開發(fā)者會(huì)一遍又一遍寫幾乎相同的列表邏輯。Django的通用視圖正是為緩解這種痛苦而開發(fā)的。它們對(duì)常用模式進(jìn)行抽象,以便你快速編寫公共視圖,而無需編寫太多代碼。

因此用列表通用視圖改寫如下:

views.py

from django.views.generic import ListView

class ArticleListView(ListView):
    # 上下文的名稱
    context_object_name = "articles"
    # 查詢集
    queryset = ArticlePost.objects.all()
    # 模板位置
    template_name = "article/list.html"

列表繼承了父類ListView,也就獲得了父類中的處理列表的方法,因此你可以看到,我們?cè)谧约旱念愔袥]有寫任何處理的邏輯,僅僅是賦值了幾個(gè)變量而已。

動(dòng)態(tài)過濾

從數(shù)據(jù)庫中篩選特定的內(nèi)容也是常見的需求,類視圖如何實(shí)現(xiàn)呢?

你可能想到了,將上面代碼中改為queryset = ArticlePost.objects.filter()就可以了。

除此之外,更好的辦法是覆寫get_queryset()方法:

views.py

...

class ArticleListView(ListView):
    context_object_name = "articles"
    template_name = "article/list.html"

    def get_queryset(self):
        """
        查詢集
        """
        queryset = ArticlePost.objects.filter(title="Python")
        return queryset

例子中只是過濾出標(biāo)題為“Python”的文章而已,有些大材小用了;但是你可以在get_queryset()中寫復(fù)雜的聯(lián)合查詢邏輯,滿足個(gè)性化的功能。

添加上下文

在博客列表的設(shè)計(jì)時(shí),我們返回給模板的上下文除了articles以外,還有很多額外的信息,如order、search;在類視圖中同樣可以實(shí)現(xiàn),改寫get_context_data()方法即可:

views.py

...

class ArticleListView(ListView):
    ...

    def get_context_data(self, **kwargs):
        # 獲取原有的上下文
        context = super().get_context_data(**kwargs)
        # 增加新上下文
        context["order"] = "total_views"
        return context

除此之外,ListView還有些別的方法可以覆寫,深入了解可以看這里:官方文檔

混入類

混入類(Mixin)是指具有某些功能、通常不獨(dú)立使用、提供給其他類繼承功能的類。嗯,就是“混入”的字面意思。

前面的列表視圖中已經(jīng)有get_context_data()方法了。假設(shè)需要寫一個(gè)功能類似的視頻列表,就可以用Mixin來避免重復(fù)代碼:

views.py

...

class ContextMixin:
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["order"] = "total_views"
        return context

class ArticleListView(ContextMixin, ListView):
    ...

class VideoListView(ContextMixin, ListView):
    ...

通過混入,兩個(gè)子類都獲得了get_context_data()方法。

從語法上看,混入是通過多重繼承實(shí)現(xiàn)的。有區(qū)別的是,Mixin是作為功能添加到子類中的,而不是作為父類。

實(shí)際上Django內(nèi)置了很多通用的Mixin類,實(shí)現(xiàn)了大部分常用的功能,點(diǎn)這里深入了解:官方文檔

詳情頁

既然列表都有通用視圖,詳情頁當(dāng)然也有對(duì)應(yīng)的DetailView

用類視圖寫一個(gè)簡(jiǎn)單的詳情頁:

views.py

from django.views.generic import DetailView

class ArticleDetailView(DetailView):
    queryset = ArticlePost.objects.all()
    context_object_name = "article"
    template_name = "article/detail.html"

然后配置url:

urls.py

...
urlpatterns = [
    # 詳情類視圖
    path("detail-view//", views.ArticleDetailView.as_view(), name="..."),
]

注意這里傳入的參數(shù)不是id而是pk,這是視圖的要求(也可以傳入slug)。pk是數(shù)據(jù)表的主鍵,在默認(rèn)情況下其實(shí)就是id。

這就寫好了!

也可以添加任何別的功能,比如統(tǒng)計(jì)瀏覽量:

views.py

...
class ArticleDetailView(DetailView):
    ...
    def get_object(self):
        """
        獲取需要展示的對(duì)象
        """
        # 首先調(diào)用父類的方法
        obj = super(ArticleDetailView, self).get_object()
        # 瀏覽量 +1
        obj.total_views += 1
        obj.save(update_fields=["total_views"])
        return obj

方法get_object()的作用是獲取需要展示的對(duì)象。首先調(diào)用父類方法,將這個(gè)對(duì)象賦值給obj變量,然后再對(duì)其進(jìn)行統(tǒng)計(jì)瀏覽量的操作,最后將對(duì)象返回。相當(dāng)于在原有的方法中把自己的邏輯“塞”了進(jìn)去。

關(guān)于DetailView更多特性看這里:官方文檔

編輯

除了能夠展示信息,通用視圖還包含CreateView、UpdateView、DeleteView編輯數(shù)據(jù)的類。

如果要新建文章,則視圖可以這么寫:

views.py

from django.views.generic.edit import CreateView

class ArticleCreateView(CreateView):
    model = ArticlePost
    
    fields = "__all__"
    # 或者只填寫部分字段,比如:
    # fields = ["title", "content"]
    
    template_name = "article/create_by_class_view.html"

創(chuàng)建create_by_class_view.html文件(目錄在哪,你應(yīng)該已經(jīng)很清楚了),寫入:

create_by_class_view.html

{% csrf_token %} {{ form.as_p }}

最后添加url:

urls.py

urlpatterns = [
    path("create-view/", views.ArticleCreateView.as_view(), name="..."),
]

雖然外觀簡(jiǎn)陋(這不是重點(diǎn)),但現(xiàn)在這個(gè)視圖確實(shí)已經(jīng)能夠創(chuàng)建新文章了!

UpdateViewDeleteView這里就不再贅述了,以后用到的地方再進(jìn)行講解。

想提前了解的同學(xué)戳這里:官方文檔

總結(jié)

有沒有感受到代碼隔離繼承的強(qiáng)大?沒有?以后的章節(jié)會(huì)逐漸使用編寫視圖,你會(huì)慢慢體會(huì)的。

類視圖的內(nèi)容非常豐富,短短一篇文章只能蜻蜓點(diǎn)水而已。讀者在編程中遇到困難了,官方文檔是你最好的教程。

如果你有耐心從頭到尾閱讀類視圖的官方文檔,那當(dāng)然是最好的了。


有疑問請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。

或Email私信我:[email protected]

項(xiàng)目完整代碼:Django_blog_tutorial

轉(zhuǎn)載請(qǐng)告知作者并注明出處。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43030.html

相關(guān)文章

  • Django搭建個(gè)人博客:編寫博客文章的Model模型

    摘要:在里寫一個(gè)數(shù)據(jù)庫驅(qū)動(dòng)的應(yīng)用的第一步是定義模型,也就是數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和附加的其它元數(shù)據(jù)。模型元數(shù)據(jù)是任何不是字段的東西,例如排序選項(xiàng)數(shù)據(jù)庫表名單數(shù)和復(fù)數(shù)名稱和。 Django 框架主要關(guān)注的是模型(Model)、模板(Template)和視圖(Views),稱為MTV模式。 它們各自的職責(zé)如下: 層次 職責(zé) 模型(Model),即數(shù)據(jù)存取層 處理與數(shù)據(jù)相關(guān)的所有事務(wù): 如何存取...

    winterdawn 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:用django-notifications實(shí)現(xiàn)消息通知

    摘要:接下來你就可以在項(xiàng)目的任何地方發(fā)送通知了像這樣其中的參數(shù)釋義發(fā)送通知的對(duì)象接收通知的對(duì)象動(dòng)詞短語鏈接到動(dòng)作的對(duì)象可選執(zhí)行通知的對(duì)象可選有點(diǎn)繞,舉個(gè)栗子杜賽在搭建個(gè)人博客中對(duì)你發(fā)表了評(píng)論。有疑問請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。 憑借你勤奮的寫作,拜讀你文章的用戶越來越多,他們的評(píng)論也分散在眾多的文章之中。作為博主,讀者的留言肯定是要都看的;而讀者給你留言,自然也希望得到回復(fù)。 怎么...

    Zoom 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:用戶的登錄和登出

    摘要:最常見的用法就是存儲(chǔ)用戶的登錄數(shù)據(jù)。如果用戶未登錄,則顯示登錄兩個(gè)字提醒用戶可以點(diǎn)擊登錄。創(chuàng)建文件用戶登錄配置根路由用戶管理配置因?yàn)檫@個(gè)并沒有改動(dòng),因此不用遷移數(shù)據(jù)??偨Y(jié)本章用到了表單類模板語句用戶驗(yàn)證等知識(shí)完成了用戶管理的登錄和退出。 用戶管理 用戶數(shù)據(jù)可以說是大部分網(wǎng)站最重要的資產(chǎn)。用戶管理就是對(duì)用戶數(shù)據(jù)進(jìn)行增刪改查等操作的功能,自然也就非常的重要了。 本章開始學(xué)習(xí)用戶管理的內(nèi)容,...

    whidy 評(píng)論0 收藏0
  • Django 學(xué)習(xí)小組:基于類的通用視圖詳解(一)

    摘要:本教程首先介紹兩個(gè)項(xiàng)目中遇到的通用視圖和。語句的作用是添加了到上下文中,還要把默認(rèn)的一些上下文變量也返回給視圖函數(shù),以便其后續(xù)處理。 通過三周的時(shí)間我們開發(fā)了一個(gè)簡(jiǎn)單的個(gè)人 Blog,教程地址: 第一周:Django 學(xué)習(xí)小組:博客開發(fā)實(shí)戰(zhàn)第一周教程 —— 編寫博客的 Model 和首頁面 第二周:Django 學(xué)習(xí)小組:博客開發(fā)實(shí)戰(zhàn)第二周教程 —— 博客詳情頁面和分類頁面 第三周:D...

    atinosun 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:結(jié)束和開始

    摘要:教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容搭建開發(fā)環(huán)境博文管理用戶管理發(fā)表評(píng)論若干小功能搭建簡(jiǎn)單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內(nèi)容。陌生人,祝你學(xué)業(yè)進(jìn)步事業(yè)有成歡迎常到杜賽的個(gè)人網(wǎng)站做客 教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容: 搭建開發(fā)環(huán)境 博文管理 用戶管理 發(fā)表評(píng)論 若干小功能 搭建簡(jiǎn)單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個(gè)個(gè)造火...

    zqhxuyuan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<