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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容