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_display
和fields
屬性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)