Django实战:搭建个人博客(三)

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_displayfields属性

    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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值