摘要:而文章分类一个重要的途径就是设置栏目。修改文件栏目的栏目标题创建时间文章栏目的一对多外键栏目的有两个字段,名称和创建日期。修改文章的栏目功能,也就完成了。对个人博客来说,栏目数据的变动通常是很少的。
博客的文章类型通常不止一种:有时候你会写高深莫测的技术文章,有时候又纯粹只记录一下当天的心情。
因此对文章的分类就显得相当的重要了,既方便博主对文章进行分类归档,也方便用户有针对性的阅读。
而文章分类一个重要的途径就是设置栏目。
栏目的模型实现文章栏目功能的方法有多种。你可以只是简单的在文章的Model中增加CharField()字段,以字符串的形式将栏目名称保存起来(实际上这种实现更像是“标签”,以后会讲到)。这样做的优点是比较简单;缺点也很明显,就是时间长了你可能会记混栏目的名字,并且也不方便对栏目的其他属性进行扩展。
因此对文章栏目可以独立为一个Model,用外键与文章的Model关联起来。
修改article/modles.py文件:
article/models.py ... class ArticleColumn(models.Model): """ 栏目的 Model """ # 栏目标题 title = models.CharField(max_length=100, blank=True) # 创建时间 created = models.DateTimeField(default=timezone.now) def __str__(self): return self.title class ArticlePost(models.Model): ... # 文章栏目的 “一对多” 外键 column = models.ForeignKey( ArticleColumn, null=True, blank=True, on_delete=models.CASCADE, related_name="article" ) ...
栏目的Model有两个字段,“名称”和“创建日期”。
一篇文章只有一个栏目,而一个栏目可以对应多篇文章,因此建立“一对多”的关系。
写好模型后记得用makemigrations和migrate指令迁移数据。
列表中显示栏目 添加测试数据模型写好之后就需要几条栏目的数据来进行测试。由于还没有写视图,因此需要善加利用Django自带的后台。
首先把栏目模型注册到后台:
article/admin.py ... from .models import ArticleColumn # 注册文章栏目 admin.site.register(ArticleColumn)
然后就可以在后台中添加栏目的数据条目了:
先随便添加了“HTML”、“Java”、“Django”这3条。
在后台中随便打开一篇文章,“栏目”字段已经静静的在等你了:
随机找几篇文章设置不同的栏目用于测试。
重写文章列表之前我们用卡片类型的UI界面展示文章列表。
卡片的好处是简洁大方,但是随着数据的增多,卡片小小的版面已经不堪重负了。
因此这里重写list.html模板的列表循环:
article/list.html ...{% for article in articles %}...{% if article.column %} {% endif %}{% endfor %}{{ article.title }}
{{ article.body|slice:"100" }}...
{{ article.total_views }} 浏览 {{ article.created|date:"Y-m-d" }} 发布 {{ article.updated|date:"Y-m-d" }} 更新
最主要的改动就是新增了展现“栏目”的按钮。我们甚至还为不同的栏目设置了不同的按钮颜色。
在附加信息中顺便还把之前没有用到的日期信息也添加上去了。
来看看效果:
感觉还不错!
修改写文章功能展示已经没问题了,但是发表新文章时还不能选择栏目。
修改写文章的模板,在表单中新增下面的内容:
templates/article/create.html ...
是表单的下拉框选择组件。在这个组件中循环列出所有的栏目数据,并且设置value属性,指定表单提交栏目的id值。
刷新页面,效果像下面这样:
跟之前一样,能够展示了,但是还没有处理表单的视图逻辑。
修改已有的写文章视图article_create(),让其能够处理表单上传的栏目数据:
article/views.py # 引入栏目Model from .models import ArticleColumn ... # 写文章的视图 ... def article_create(request): if request.method == "POST": ... if article_post_form.is_valid(): ... # 新增的代码 if request.POST["column"] != "none": new_article.column = ArticleColumn.objects.get(id=request.POST["column"]) # 已有代码 new_article.save() ... else: ... # 新增及修改的代码 columns = ArticleColumn.objects.all() context = { "article_post_form": article_post_form, "columns": columns } ...
新增代码涉及get和post两部分:
POST:主要考虑某些文章是可以没有栏目的。因此用if语句判断该文章是否有栏目,如果有,则根据表单提交的value值,关联对应的栏目。
GET:增加栏目的上下文,以便模板使用。
测试一下,写文章的栏目功能应该可以正常工作了。
修改更新视图更新文章的视图同样也需要升级一下。
还是先更改模板:
templates/article/update.html ......
与前面稍有不同的是,表单中判断了column.id与article.column.id是否相等,如果相等则将其设置为默认值。
然后修改视图函数:
article/views.py # 更新文章 ... def article_update(request, id): ... # 判断用户是否为 POST 提交表单数据 if request.method == "POST": ... if article_post_form.is_valid(): ... # 新增的代码 if request.POST["column"] != "none": article.column = ArticleColumn.objects.get(id=request.POST["column"]) else: article.column = None ... else: ... # 新增及修改的代码 columns = ArticleColumn.objects.all() context = { "article": article, "article_post_form": article_post_form, "columns": columns, } ...
代码逻辑与前面很类似。修改文章的栏目功能,也就完成了。
总结本章实现了简单的栏目功能,可以舒舒服服对文章进行分类了,强迫症福音啊。
还有些可以完善的工作,比如:
单击栏目按钮显示所有相同栏目的文章。这个功能与之前学过的最热文章排序以及搜索文章非常的类似。还记得filter()方法吗?
栏目Model的增删改查。
对个人博客来说,栏目数据的变动通常是很少的。如果你不想写增删改查,用后台修改数据是完全可以的。
以上内容就不再赘述了。留给读者去尝试实现。
有疑问请在杜赛的个人网站留言,我会尽快回复。
或Email私信我:dusaiphoto@foxmail.com
项目完整代码:Django_blog_tutorial
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43103.html
摘要:每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。列表中显示标签虽然保存标签的功能已经实现了,还得把它显示出来才行。更多的用法请阅读官方文档总结本章学习了使用来完成标签功能。 标签是作者从文章中提取的核心词汇,其他用户可以通过标签快速了解文章的关注点。每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。 好在标签功能也有优秀的三方库:D...
摘要:教程看到这里,你已经学会如下内容搭建开发环境博文管理用户管理发表评论若干小功能搭建简单的小博客,以上的功能够用了。教程为了起步平缓,没有展开这方面的内容。陌生人,祝你学业进步事业有成欢迎常到杜赛的个人网站做客 教程看到这里,你已经学会如下内容: 搭建开发环境 博文管理 用户管理 发表评论 若干小功能 搭建简单的小博客,以上的功能够用了。 相信你的志向不止于此。毕竟程序员面试个个造火...
摘要:比较流行的解决方案是允许用户通过第三方登录,即可以通过微博这类知名社区的授权,从而登录你的小站,免去了注册的麻烦。微博微信的登录方式大致都遵循这个流程本章虽然加载了微博的接口,但是限于篇幅并没有配置,请读者查阅官方文档去实现。 现在我们已经拥有一个可以进行用户本地登录的博客系统了。如果有人欣赏你的文章,说不定就会注册成为本地用户,并和你好好交流一番。 但头疼的是,用户可能每天都在互联网...
摘要:语法支持再次打开文件,在文件的最后添加指明了使用语法标记,做了两个拓展,其中表示支持语法高亮,包含的特性请参见相关文档。语法高亮支持注意这一步必须在安装完主题之后。 目前网上搭建个人博客的方案很多,虽然使用诸如 Wordpress ( PHP )、Hexo ( Node.js ) 等可以方便快速地搭建一款功能齐全的高性能个人博客,但是本文将尝试一种更为小众化的方案 —— 一款基于 dj...
摘要:随着时间的推移加上勤奋的写作,你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。这个时候就需要对文章进行分页的处理。有疑问请在杜赛的个人网站留言,我会尽快回复。 随着时间的推移(加上勤奋的写作!),你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。 这个时...
阅读 2672·2023-04-25 17:21
阅读 2518·2021-11-23 09:51
阅读 2790·2021-09-24 10:32
阅读 3694·2021-09-23 11:33
阅读 1947·2019-08-30 15:44
阅读 3436·2019-08-30 11:18
阅读 3419·2019-08-30 10:53
阅读 604·2019-08-26 13:25