Django实战:搭建个人博客(三)
后台的优化
1. 应用汉化
-
后台汉化
修改settings文件中的语言和时区:
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
-
表单汉化
修改
blog/apps.py
里的应用配置信息:class BlogConfig(AppConfig): name = 'blog' verbose_name='博客'
修改settings文件中blog应用的注册信息:
INSTALLED_APPS = [ ... 'blog.apps.BlogConfig', # 注册blog应用的配置信息 ]
-
模型名称汉化
以Category为例,通过内部类Meta修改模型名称:
class Category(models.Model): name = models.CharField(max_length=20) class Meta: verbose_name = '分类' verbose_name_plural = verbose_name # 复数名称,不覆写则自动加s
-
模型属性汉化
以Post为例,为各个属性添加verbose_name参数:
title = models.CharField('标题', max_length=40) # '标题'作为第一个位置参数传给verbose_name tag = models.ManyToManyField(Tag, verbose_name='标签') # 由于关联属性的第一个参数必须是关联的类,所以用关键词参数
2. 创建时间等信息自动填写
-
创建时间:用default参数传入当前时间
from django.utils import timezone createdTime = models.DateTimeField('创建时间', default=timezone.now()) # 默认值为当前时间,timezone.now可以自适应时区
-
修改时间:覆写Post的父类Model的save方法
def save(self, *args, **kwargs): self.modifiedTime = timezone.now() # 每次保存实例时都变更一次修改时间 super().save(*args, **kwargs)
-
作者:覆写
admin.py/PostAdmin
的父类ModelAdmin的save_model()方法admin.site.register(Post, PostAdmin) # 注意将PostAdmin和Post关联注册 class PostAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.author = request.user # request.user是当前登录的用户 super().save_model(request, obj, form, change)
-
属性展示与填写的调整,可以通过修改PostAdmin的
list_display
和fields
属性class PostAdmin(admin.ModelAdmin): # Post表单展示的属性 list_display = ['title', 'createdTime', 'modifiedTime', 'category', 'author'] # Post表单需要人工填写的属性 fields = ['title', 'body', 'excerpt', 'category','tag']
Markdown语法支持
在数据库中保存的数据是原始数据,希望在显示时按照Markdown语法显示,修改视图函数如下:
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)
# 实例化一个markdown对象,添加了一些额外语法如代码高亮
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添加一个toc属性,可以在模板中调用以显示目录
post.toc = m.group(1) if m is not None else ''
return render(request, 'blog/detail.html', context={'post': post})
经过转换,post.body
已经转换成了html文本,由于Django的安全机制,在detail模板中调用post.body
时要加上safe过滤器,告诉Django这段文本可以正常渲染:
{{ post.body|safe }}
继续添加代码高亮效果参照让博客支持 Markdown 语法和代码高亮
自动生成摘要
为了自动生成文章摘要,可以就像自动生成修改时间一样,覆写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可以剥去html文本的标签
self.excerpt=strip_tags(md.convert(self.body))[:300]
super().save(*args, **kwargs)