博客閱讀數(shù)的統(tǒng)計三部曲【二】-閱讀計數(shù)的分離

博客閱讀數(shù)的統(tǒng)計三部曲【一】-3種方式中講到的3種方式扼仲,其模型都是在blog應(yīng)用下models.py里面寫的,這樣耦合性太強渠缕,不利于以后給其他應(yīng)用的拓展
這節(jié)講的是將閱讀計數(shù)的功能單獨創(chuàng)建出一個app應(yīng)用,打包發(fā)后便于其他項目的拓展使用

app應(yīng)用的分離

Github源碼地址:請點這里

image.png

1.此方法是將閱讀計數(shù)功能分離出來,獨立作為一個app引用趋距,便于打包在線安裝供其他項目中的使用

其中使用的功能方法詳見Django官方文檔“The contenttypes framework”(內(nèi)容類型框架)

具體頁面鏈接地址:Django官網(wǎng)文檔

image.png

image.png

2.首先使用命令新建獨立應(yīng)用

python manage.py startapp read_statistics

接下來將read_statistics應(yīng)用添加到settings.py的apps里面,如下圖:

image.png

3.創(chuàng)建read_statistics應(yīng)用下的models.py模型

具體參照Django官方文檔: https://docs.djangoproject.com/en/2.0/ref/contrib/contenttypes/

image.png
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType


class ReadNum(models.Model):
    read_num=models.IntegerField(default=0,verbose_name='閱讀數(shù)')
    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        verbose_name='閱讀數(shù)'
        verbose_name_plural=verbose_name

4.同步更新數(shù)據(jù)庫操作

python manage.py makemigrations

python manage.py migrate

5.配置read_statistics應(yīng)用下的admin.py

image.png
from django.contrib import admin
from .models import ReadNum

class ReadNumAdmin(admin.ModelAdmin):
    list_display=('id','read_num','content_object')

admin.site.register(ReadNum,ReadNumAdmin)

添加完成后Django登錄管理界面

image.png
image.png

6.下面在blog應(yīng)用下的models.py模型里面添加獲取閱讀數(shù)的方法get_read_num()

注意:添加這個方法是為了在Django管理界面的blog應(yīng)用下越除,將get_read_num添加到list_display展示列表节腐,從而可以在博客頁面直接看到該篇文章所對應(yīng)的閱讀數(shù)

記得引用
from django.db.models.fields import exceptions
from django.contrib.contenttypes.models import ContentType
from read_statistics.models import ReadNum

image.png
from django.db import models
from django.db.models.fields import exceptions
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from ckeditor_uploader.fields import RichTextUploadingField

from read_statistics.models import ReadNum

class Blog(models.Model):
    title=models.CharField(max_length=50,verbose_name=u'標題')
    blog_type=models.ForeignKey(Blog_type,on_delete=models.DO_NOTHING)
    content=RichTextUploadingField()
    author=models.ForeignKey(User,on_delete=models.DO_NOTHING,verbose_name='作者')
    created_time=models.DateTimeField(auto_now_add=True,verbose_name=u'創(chuàng)建時間')
    last_update_time=models.DateTimeField(auto_now=True,verbose_name=u'修改時間')
    is_delete=models.BooleanField(default=False,verbose_name=u'是否刪除')

    # 添加方法,添加的get_read_num方法,用于在admin管理后臺的blog頁面顯示閱讀數(shù)摘盆。即在admin.py的                                                                                        BlogAdmin類的list_display添加read_num
    def get_read_num(self):
        # 返回該篇文章的閱讀數(shù),此處如果該文章還沒有閱讀數(shù)翼雀,會有個異常,該異常是的默認閱讀數(shù)不是0孩擂,而是-
        try:
            ct=ContentType.objects.get_for_model(Blog)
            readnum=ReadNum.objects.get(content_type=ct,object_id=self.pk)
            return readnum.read_num
        except exceptions.ObjectDoesNotExist:
            return 0
        
    class Meta:
        ordering=['-created_time']
        verbose_name='博客'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.title

7.再將上面get_read_num()方法添加到blog應(yīng)用下面的admin.py的list_display列表

image.png

完成后狼渊,打開Django管理頁面的博客,便可以看到每篇文章get_read_num的閱讀數(shù)类垦,如下圖:

image.png

8.在bolg應(yīng)用下的views.py狈邑,處理用于前臺頁面閱讀數(shù)展示的邏輯關(guān)系

image.png
from django.contrib.contenttypes.models import ContentType
from read_statistics.models import ReadNum

def blog_detail(request,blog_pk):
    """博客詳情頁"""
    blog=get_object_or_404(Blog,pk=blog_pk) # 根據(jù)傳入blog_pk的ID來找到具體對應(yīng)博客文章

    # 獲取cookie:根據(jù)獲取cookie的key值'blog_%s_readed' % blog_pk,判斷是否存在蚤认,不存在則閱讀數(shù)                                                                                                                                +1
    if not request.COOKIES.get('blog_%s_read' % blog_pk):
        ct=ContentType.objects.get_for_model(Blog)

        if ReadNum.objects.filter(content_type=ct,object_id=blog.pk).count():
            # 記錄存在,則查詢并閱讀數(shù)+1米苹,保存
            readnum=ReadNum.objects.get(content_type=ct,object_id=blog.pk)
        else:
            # 對應(yīng)記錄不存在,則創(chuàng)建并閱讀數(shù)+1砰琢,保存(這樣就會在閱讀數(shù)管理頁面點擊后保存對應(yīng)文章以及閱讀數(shù))
            readnum=ReadNum(content_type=ct,object_id=blog.pk)
        readnum.read_num += 1    #點擊該篇文章蘸嘶,閱讀數(shù)自增1
        readnum.save()  

    pre_blog=Blog.objects.filter(id__gt=blog.id).last() # 博客的上一篇文章
    next_blog=Blog.objects.filter(id__lt=blog.id).first()   # 博客的下一篇文章
    response=render(request,'blog/blog_detail.html',{'blog':blog,'pre_blog':pre_blog,'next_blog':next_blog})    #響應(yīng)
    
    # 設(shè)置cookie,打開過這篇文章即寫入cookie,key是'blog_%s_readed' % blog_pk,value是'true'
    response.set_cookie('blog_%s_read' % blog_pk,'true')
    return response

9.最后在html頁面,使用get_read_num方法獲取閱讀數(shù)的數(shù)據(jù)

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陪汽,一起剝皮案震驚了整個濱河市训唱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挚冤,老刑警劉巖况增,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異你辣,居然都是意外死亡巡通,警方通過查閱死者的電腦和手機尘执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宴凉,“玉大人誊锭,你說我怎么就攤上這事∶殖” “怎么了丧靡?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長籽暇。 經(jīng)常有香客問我温治,道長,這世上最難降的妖魔是什么戒悠? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任熬荆,我火速辦了婚禮,結(jié)果婚禮上绸狐,老公的妹妹穿的比我還像新娘卤恳。我一直安慰自己,他們只是感情好寒矿,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布突琳。 她就那樣靜靜地躺著,像睡著了一般符相。 火紅的嫁衣襯著肌膚如雪拆融。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天啊终,我揣著相機與錄音镜豹,去河邊找鬼。 笑死孕索,一個胖子當(dāng)著我的面吹牛逛艰,可吹牛的內(nèi)容都是我干的躏碳。 我是一名探鬼主播搞旭,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菇绵!你這毒婦竟也來了肄渗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤咬最,失蹤者是張志新(化名)和其女友劉穎翎嫡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體永乌,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡惑申,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年具伍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圈驼。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡人芽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绩脆,到底是詐尸還是另有隱情萤厅,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布靴迫,位于F島的核電站惕味,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玉锌。R本人自食惡果不足惜名挥,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望主守。 院中可真熱鬧躺同,春花似錦、人聲如沸丸逸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黄刚。三九已至捎谨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憔维,已是汗流浹背涛救。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留业扒,地道東北人检吆。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像程储,于是被迫代替她去往敵國和親蹭沛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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