Django實(shí)戰(zhàn):搭建個(gè)人博客(三)

Django實(shí)戰(zhàn):搭建個(gè)人博客(三)

[TOC]

后臺(tái)的優(yōu)化

1. 應(yīng)用漢化

  • 后臺(tái)漢化

    修改settings文件中的語言和時(shí)區(qū):

    LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'
    
  • 表單漢化

    修改blog/apps.py里的應(yīng)用配置信息:

    class BlogConfig(AppConfig):
        name = 'blog'
        verbose_name='博客'
    

    修改settings文件中blog應(yīng)用的注冊(cè)信息:

    INSTALLED_APPS = [
        ...
        'blog.apps.BlogConfig',  # 注冊(cè)blog應(yīng)用的配置信息
    ]
    
  • 模型名稱漢化

    以Category為例,通過內(nèi)部類Meta修改模型名稱:

    class Category(models.Model):
        name = models.CharField(max_length=20)
        class Meta:
            verbose_name = '分類'
            verbose_name_plural = verbose_name  # 復(fù)數(shù)名稱,不覆寫則自動(dòng)加s
    
  • 模型屬性漢化

    以Post為例导饲,為各個(gè)屬性添加verbose_name參數(shù):

    title = models.CharField('標(biāo)題', max_length=40)  # '標(biāo)題'作為第一個(gè)位置參數(shù)傳給verbose_name
    tag = models.ManyToManyField(Tag, verbose_name='標(biāo)簽')  # 由于關(guān)聯(lián)屬性的第一個(gè)參數(shù)必須是關(guān)聯(lián)的類棠枉,所以用關(guān)鍵詞參數(shù)
    

2. 創(chuàng)建時(shí)間等信息自動(dòng)填寫

  • 創(chuàng)建時(shí)間:用default參數(shù)傳入當(dāng)前時(shí)間

    from django.utils import timezone
    createdTime = models.DateTimeField('創(chuàng)建時(shí)間', default=timezone.now())  # 默認(rèn)值為當(dāng)前時(shí)間辈讶,timezone.now可以自適應(yīng)時(shí)區(qū)
    
  • 修改時(shí)間:覆寫Post的父類Model的save方法

    def save(self, *args, **kwargs):
        self.modifiedTime = timezone.now()  # 每次保存實(shí)例時(shí)都變更一次修改時(shí)間
        super().save(*args, **kwargs)
    
  • 作者:覆寫admin.py/PostAdmin的父類ModelAdmin的save_model()方法

    admin.site.register(Post, PostAdmin)  # 注意將PostAdmin和Post關(guān)聯(lián)注冊(cè)
    
    class PostAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            obj.author = request.user  # request.user是當(dāng)前登錄的用戶
            super().save_model(request, obj, form, change)
    
  • 屬性展示與填寫的調(diào)整,可以通過修改PostAdmin的list_displayfields屬性

    class PostAdmin(admin.ModelAdmin):
        # Post表單展示的屬性
        list_display = ['title', 'createdTime', 'modifiedTime', 'category', 'author']
        # Post表單需要人工填寫的屬性
        fields = ['title', 'body', 'excerpt', 'category','tag']
    

Markdown語法支持

在數(shù)據(jù)庫中保存的數(shù)據(jù)是原始數(shù)據(jù)月幌,希望在顯示時(shí)按照Markdown語法顯示扯躺,修改視圖函數(shù)如下:

import markdown
from django.utils.text import slugify
from markdown.extensions.toc import TocExtension
def detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    # 實(shí)例化一個(gè)markdown對(duì)象录语,添加了一些額外語法如代碼高亮
    md = markdown.Markdown(extensions=[
        'markdown.extensions.extra',
        'markdown.extensions.codehilite',
        # 記得在頂部引入 TocExtension 和 slugify
        TocExtension(slugify=slugify),
    ])
    post.body = md.convert(post.body)
    m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)
    # 為post添加一個(gè)toc屬性,可以在模板中調(diào)用以顯示目錄
    post.toc = m.group(1) if m is not None else ''
    return render(request, 'blog/detail.html', context={'post': post})

經(jīng)過轉(zhuǎn)換蒲稳,post.body已經(jīng)轉(zhuǎn)換成了html文本江耀,由于Django的安全機(jī)制祥国,在detail模板中調(diào)用post.body時(shí)要加上safe過濾器系宫,告訴Django這段文本可以正常渲染:

{{ post.body|safe }}

繼續(xù)添加代碼高亮效果參照讓博客支持 Markdown 語法和代碼高亮

自動(dòng)生成摘要

為了自動(dòng)生成文章摘要扩借,可以就像自動(dòng)生成修改時(shí)間一樣潮罪,覆寫Post模型的save方法嫉到。

from django.utils.html import strip_tags
def save(self, *args, **kwargs):
    self.modifiedTime = timezone.now()
    md = markdown.Markdown(extensions=[
        'markdown.extensions.extra',
        'markdown.extensions.codehilite',
    ])
    # strip_tags可以剝?nèi)tml文本的標(biāo)簽
    self.excerpt=strip_tags(md.convert(self.body))[:300]
    super().save(*args, **kwargs)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嚼黔,隨后出現(xiàn)的幾起案子唬涧,更是在濱河造成了極大的恐慌碎节,老刑警劉巖狮荔,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创坞,死亡現(xiàn)場離奇詭異题涨,居然都是意外死亡纲堵,警方通過查閱死者的電腦和手機(jī)席函,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門正蛙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乒验,“玉大人锻全,你說我怎么就攤上這事鳄厌×撕浚” “怎么了新思?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長邀窃。 經(jīng)常有香客問我,道長鞍历,這世上最難降的妖魔是什么劣砍? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮装畅,結(jié)果婚禮上掠兄,老公的妹妹穿的比我還像新娘。我一直安慰自己迅诬,他們只是感情好百框,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布慎菲。 她就那樣靜靜地躺著,像睡著了一般解幼。 火紅的嫁衣襯著肌膚如雪撵摆。 梳的紋絲不亂的頭發(fā)上特铝,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音灵莲,去河邊找鬼。 笑死赠幕,一個(gè)胖子當(dāng)著我的面吹牛榕堰,可吹牛的內(nèi)容都是我干的逆屡。 我是一名探鬼主播砍的,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼廓鞠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砌们?” 一聲冷哼從身側(cè)響起浪感,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赢笨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐筏,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踱葛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洲赵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苛谷,我是刑警寧澤部宿,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布绵患,位于F島的核電站雾叭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏筏勒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荡陷。 院中可真熱鬧废赞,春花似錦、人聲如沸渣蜗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽既峡。三九已至运敢,卻和暖如春传惠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盼砍。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國打工黔宛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跌宛,地道東北人积仗。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓疆拘,卻偏偏與公主長得像哎迄,于是被迫代替她去往敵國和親翔烁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旨涝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361