用Django全栈开发——13. 设计实现文章发布模型

961 阅读3分钟

大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程,从零开始,到最后成功部署上线的项目。这一节,我们来设计文章的模型。

Peekpa.com的官方地址:peekpa.com

上一节,我们已经把文章详情页写好了,这一节,我们要开发文章模型了。

早在一开始,我们就创建了Post应用,那么我们的文章结构设计,也会在这个应用当中创建。

需求分析

首先我们得简单分析一下文章模型应该有哪些变量:

  • 标题(title)
  • 作者(author)
  • 摘要(description)
  • 缩略图(thumbnail)
  • 正文(content)
  • 正文HTML(content_html)
  • 是否是md格式(is_md)
  • 分类(category)
  • 标签(tag)
  • 状态(status)
  • 发布时间(publish_time)
  • 显示时间(publish_time_show)
  • 文章时间ID(time_id)

这里要说一下‘是否是md格式’和‘正文HTML’这两个变量。

因为我们的文章是以md格式写的,所以这里我们要做一个判断,是否是md格式输入。如果是md格式的输入,我们使用mistune库来讲我们输入的md文章转化成html格式,再将结果保存到content_html中。

细心的同学就会发现,这里我们新引入了两个东西,分类(category)和标签(tag),这两个东西,我们也要单独抽出来,创建模型,但是这两个目前很简单,只需要一个名字就好了。

但是,因为我们的首页有好几个板块,比如把文章放到顶部的四个位置,所以我们还需要添加几个辅助变量才行:

  • 是否是置顶文章(is_top)
  • 是否是首页文章(is_hot)
  • 权重(priority)

简单说一下这几个变量的作用:

  • 是否是置顶文章,是将来还会有文章列表页面,到时候需要一篇或者两篇文章是置顶的;
  • 是否首页文章和权重,则是反映出首页顶部四个大图的文章。通过权重的值来调整位置。

这下简单了,接下来我们就只需要在Post应用下的models.py文件中,创建我们的post,category还有tag类就可以了:

class Category(models.Model):
    name = models.CharField(max_length=100)
    create_time = models.DateTimeField(auto_now_add=True)


class Tag(models.Model):
    name = models.CharField(max_length=100)
    create_time = models.DateTimeField(auto_now_add=True)


class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey('peekpauser.User', on_delete=models.SET_NULL, null=True)
    description = models.CharField(max_length=200)
    thumbnail = models.URLField()

    content = models.TextField()
    content_html = models.TextField(blank=True, editable=False)
    is_md = models.BooleanField(default=True)

    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    tag = models.ManyToManyField(Tag)

    status = models.PositiveIntegerField(default=STATUS_DRAFT, choices=STATUS_ITEMS)
    publish_time = models.DateTimeField(auto_now_add=True)
    publish_time_show = models.DateTimeField(default=datetime.datetime.now)
    time_id = models.CharField(blank=True, max_length=30)

这里简单说一下:

  • author使用的是外键,和peekpauser联动在一起;
  • content_html默认是空,只有在保存的时候,如果is_md是true,才会自动保存content_html的内容,而且不能编辑,全部都靠系统自动保存;
  • categorytag分别是一对一和多对多;
  • status则是表示文章状态;

最后别忘了,我们需要在settings.py文件里的INSTALLED_APPS里面添加我们post应用,即:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.peekpauser',
    'apps.poster',  # 新添加的Poster应用
]

此时,在执行makemigration和migrate命令,就会看到下面的图片:

看到系统为我们创建了几张表,我们再到数据库里面看一下:

没错,就是红框里面的那几个表。

到此,我们的Post模型就创建完了。下一步我们就是在CMS系统里面添加发布文章了。

技术总结

最后总结一下,

文章Post模型:

  1. 在Post目录下的models.py文件里面创建数据类;
  2. 提前分析可能会出现的变量,设计相关变量的类型和默认值;
  3. 在settings.py文件中的INSTALLED_APPS里面添加post应用;
  4. 只有在settings.py文件中添加了,才能执行makemiagration和migrate命令有效;
  5. 完毕。

获取代码的唯一途径:关注『皮爷撸码』,回复『代码』即可获得。

长按下图二维码关注,如文章对你有启发,欢迎在看与转发。