前奏小知识

1. 通过url参数组合不同的过滤条件

django框架部分

1. 数据结构models

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. # 大分类表
  6. class Category(models.Model):
  7. caption = models.CharField(max_length=32)
  8.  
  9. # 文章类型表
  10. class ArticleTyp(models.Model):
  11. caption = models.CharField(max_length=32)
  12.  
  13. # 创建一个文章表,设置标题和内容;文章大分类小分类 四个字段
  14. class Article(models.Model):
  15. title = models.CharField(max_length=1024)
  16. content = models.CharField(max_length=30720)
  17. category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL)
  18. article_type = models.ForeignKey(ArticleTyp, null=True, on_delete=models.SET_NULL)
  19. # 测试使用内存级别选项,不存储于数据库
  20. # type_choice = (
  21. # (1, "Python"),
  22. # (2, "JavaScript"),
  23. # (3, "前端"),
  24. # )
  25. # article_type_id = models.IntegerField(choices=type_choice)

2. url

  1. url(r'^article/-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', blog_views.Article.as_view()),

3.views

  1. from django.shortcuts import render
  2.  
  3. from django.views import View
  4. from Blog import models
  5. # Create your views here.
  6.  
  7. class Article(View):
  8. def get(self, request, *args, **kwargs):
  9. # 查询时的过滤条件
  10. condition = {}
  11. for k, v in kwargs.items():
  12. # 渲染html文件中判断是否为选中分类:url参数为字符串;数据库查询出来的id为int类型
  13. # 转换为同一个类型,渲染模板时做比较
  14. kwargs[k] = int(v)
  15. if v == '0': # 如果为零,查询条件中就不传入此参数
  16. pass
  17. else:
  18. condition[k] = v
  19.  
  20. print(condition)
  21. article_type_list = models.ArticleTyp.objects.all()
  22. # models 中使用内存级别字段
  23. # article_type_list = models.Article.type_choice
  24. category_list = models.Category.objects.all()
  25. result = models.Article.objects.filter(**condition)
  26. return render(
  27. request,
  28. # 'blog/article.html',
  29. 'blog/article_simple_tag.html',
  30. {'article_type_list': article_type_list,
  31. 'category_list': category_list,
  32. 'articles': result,
  33. 'condition_dict': kwargs}
  34. )

4. models 数据库类型核对

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. # 大分类表
  6. class Category(models.Model):
  7. caption = models.CharField(max_length=32)
  8.  
  9. # 文章类型表
  10. class ArticleTyp(models.Model):
  11. caption = models.CharField(max_length=32)
  12.  
  13. # 创建一个文章表,设置标题和内容;文章大分类小分类 四个字段
  14. class Article(models.Model):
  15. title = models.CharField(max_length=1024)
  16. content = models.CharField(max_length=30720)
  17. category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL)
  18. article_type = models.ForeignKey(ArticleTyp, null=True, on_delete=models.SET_NULL)
  19. # 测试使用内存级别选项,不存储于数据库
  20. # type_choice = (
  21. # (1, "Python"),
  22. # (2, "JavaScript"),
  23. # (3, "前端"),
  24. # )
  25. # article_type_id = models.IntegerField(choices=type_choice)

5.自定义html模板 函数 生成过滤项的a 标签html字符串

templatetags/condition_filter.py

  1. #!/usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3. # @Time: 2020/8/8 11:17
  4. # @Author:zhangmingda
  5. # @File: condition_filter.py
  6. # @Software: PyCharm
  7. # Description:
  8.  
  9. from django import template
  10. from django.utils.safestring import mark_safe
  11.  
  12. register = template.Library()
  13.  
  14. @register.simple_tag
  15. def filter_all(condition_dict, all_condition):
  16. article_type_id = condition_dict["article_type_id"]
  17. category_id = condition_dict["category_id"]
  18.  
  19. all_ret = ""
  20. if all_condition == "article_type_id":
  21. if article_type_id == 0:
  22. all_ret = '<a href="/article/-0-%s.html" class="condition active">全部</a>' % category_id
  23. else:
  24. all_ret = '<a href="/article/-0-%s.html" class="condition ">全部</a>' % category_id
  25. if all_condition == "category_id":
  26. if category_id == 0:
  27. all_ret = '<a href="/article/-%s-0.html" class="condition active">全部</a>' % article_type_id
  28. else:
  29. all_ret = '<a href="/article/-%s-0.html" class="condition ">全部</a>' % article_type_id
  30.  
  31. all_ret = mark_safe(all_ret)
  32.  
  33. return all_ret
  34.  
  35. @register.simple_tag
  36. def filter_article_type(condition_dict, article_type_list ):
  37. """
  38. {% if condition_dict.article_type_id == article_type.id %}
  39. <a href="/article/-{{ article_type.id }}-{{ condition_dict.category_id }}.html" class="condition active">{{ article_type.caption }}</a>
  40. {% else %}
  41. <a href="/article/-{{ article_type.id }}-{{ condition_dict.category_id }}.html" class="condition">{{ article_type.caption }}</a>
  42. {% endif %}
  43. :return:
  44. """
  45. a_tag_list = []
  46. for article_type in article_type_list:
  47.  
  48. article_type_id = article_type.id
  49. # models 中使用内存级别字段
  50. # article_type_id = article_type[0]
  51.  
  52. if condition_dict["article_type_id"] == article_type_id:
  53. ret = '<a href="/article/-{article_type_id}-{category_id}.html" class="condition active">{article_type_caption}</a>'.format(
  54. article_type_id=article_type_id,
  55. category_id=condition_dict.get('category_id'),
  56. article_type_caption=article_type.caption,
  57. # models 中使用内存级别字段
  58. # article_type_caption=article_type[1]
  59. )
  60. else:
  61. ret = '<a href="/article/-{article_type_id}-{category_id}.html" class="condition ">{article_type_caption}</a>'.format(
  62. article_type_id=article_type_id,
  63. category_id=condition_dict.get('category_id'),
  64. article_type_caption=article_type.caption,
  65. # models 中使用内存级别字段
  66. # article_type_caption=article_type[1]
  67. )
  68. a_tag_list.append(ret)
  69. all_a_tag = ''.join(a_tag_list)
  70. return mark_safe(all_a_tag)
  71.  
  72. @register.simple_tag
  73. def filter_category(condition_dict, category_list ):
  74. """
  75. {% for category in category_list %}
  76. {% if condition_dict.category_id == category.id %}
  77. <a href="/article/-{{ condition_dict.article_type_id }}-{{ category.id }}.html" class="condition active" >{{ category.caption }}</a>
  78. {% else %}
  79. <a href="/article/-{{ condition_dict.article_type_id }}-{{ category.id }}.html" class="condition" >{{ category.caption }}</a>
  80. {% endif %}
  81. {% endfor %}
  82. :param condition_dict:
  83. :param category_list:
  84. :return:
  85. """
  86. filter_category_tag_list = []
  87. for category in category_list:
  88. category_id = category.id
  89. if condition_dict.get("category_id") == category_id:
  90. category_a_tag = '<a href="/article/-%s-%s.html" class="condition active" >%s</a>' % (condition_dict.get("article_type_id"), category_id, category.caption )
  91. else:
  92. category_a_tag = '<a href="/article/-%s-%s.html" class="condition " >%s</a>' % (condition_dict.get("article_type_id"), category_id, category.caption )
  93. filter_category_tag_list.append(category_a_tag)
  94. ret = ''.join(filter_category_tag_list)
  95. return mark_safe(ret)

7.html 加载自定义模板方法

  1. {% load condition_filter %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <style>
  8. .condition{
  9. display: inline-block;
  10. border: 1px solid #dddddd;
  11. padding: 3px 5px;
  12. margin: 5px;
  13. }
  14. .condition.active {
  15. background-color: #843534;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <h1>过滤条件</h1>
  21. <div>
  22. <!--使用simpletag自定义函数生成HTML标签-->
  23. {% filter_all condition_dict "article_type_id" %}
  24. {% filter_article_type condition_dict article_type_list %}
  25. </div>
  26. <div>
  27. <!--使用simpletag自定义函数生成HTML标签-->
  28. {% filter_all condition_dict "category_id" %}
  29. {% filter_category condition_dict category_list %}
  30. </div>
  31. <h1>查询结果</h1>
  32. <ul>
  33. {% for article in articles %}
  34. <li> {{ article.id }} - {{ article.title }}</li>
  35. {% endfor %}
  36. </ul>
  37. </body>
  38. </html>

正式来一发

数据库设计

  1. """
  2.  
  3. 用户表:UserInfo
  4. nid 自增列
  5. username 用户名 不可重复
  6. password 密码
  7. nickname 昵称
  8. email 邮箱
  9. avtar 头像
  10. create_time 创建时间
  11. fans 粉丝们 ---- 多对多表 外键自己
  12.  
  13. 个人博客信息表:Blog
  14. nid 自增列
  15. title 个人博客标题
  16. site 个人博客前缀
  17. theme 博客主题
  18. user 博客一对一 对应用户id
  19.  
  20. 互粉关系表:UserFans
  21. user 博主 外键到用户表
  22. folower 粉丝 外键到用户表
  23. class Meta: 不可重复
  24. unique_together = [('user', 'follower')]
  25.  
  26. 文章分类表(博主个人):Category
  27. nid 自增
  28. title 标题
  29. blog 所属博客 -- 外键到博客表
  30.  
  31. 文章标签表:Tag
  32. nid 自增主键
  33. title 标签名称
  34. blog 所属博客 - 外键到博客表-主键
  35.  
  36. 文章内容表:ArticleDetail
  37. content 文章内容
  38. aritcle 所属文章 - 外键到文章信息表
  39.  
  40. 顶/踩 统计:UpDown
  41. aritcle 对应文章 - 外键到 文章表的主键
  42. user 用户 外键到用户表主键
  43. up 顶或者是踩:布尔值即可
  44. class Meta: # 两个字段合并唯一 :顶或者踩,一篇文章只能顶或者踩一次
  45. unique_together = [('article', 'user')]
  46.  
  47. 评论表:Comment
  48. nid 自增主键
  49. content 内容
  50. create_time 创建时间
  51. reply 回复/评论 对自己表中已有的数据:self
  52. article 被评论的文章 - 外键到文章表主键
  53. user 评论着 - 外键到用户表 主键
  54.  
  55. 文章表:Article
  56. nid 自增主键
  57. title 文章标题
  58. summary 文章简介
  59. read_count 阅读量
  60. comment_count 评论数量
  61. up_count 点赞数量
  62. down_count 踩量
  63. create_time 创建时间
  64. blog 所属博客
  65. category 文章类型
  66. type_choices 语言分类选项
  67. article_type 语言分类
  68. tags 标签 多对多 指定多对多的第三张表名Article2Tag
  69.  
  70. 文章-标签多对多表:Article2Tag
  71. article 文章 外键到文章表主键
  72. tag 标签 外键到标签表主键
  73. class Meta: 标签&文章一起,不得重复
  74. unique_together = [('article', 'tag')]
  75.  
  76. """

数据库表结构代码

models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class UserInfo(models.Model):
  6. """
  7. 用户表
  8. """
  9. uid = models.BigAutoField(primary_key=True)
  10. username = models.CharField(max_length=32, unique=True, verbose_name="用户名")
  11. password = models.CharField(verbose_name='密码', max_length=64)
  12. nickname = models.CharField(verbose_name='昵称', max_length=32)
  13. email = models.EmailField(verbose_name='邮箱', unique=True)
  14. avatar = models.ImageField(verbose_name='头像')
  15. create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
  16. fans = models.ManyToManyField(verbose_name='粉丝们',
  17. to='UserInfo',
  18. through='UserFans',
  19. through_fields=('user', 'follower'))
  20.  
  21. class UserFans(models.Model):
  22. """互粉关系表"""
  23. user = models.ForeignKey(verbose_name='博主', to=UserInfo, to_field='uid', related_name='users', on_delete=models.SET_NULL, null=True)
  24. follower = models.ForeignKey(verbose_name='粉丝', to=UserInfo, to_field='uid', related_name='followers', on_delete=models.SET_NULL, null=True)
  25. class Meta:
  26. unique_together = [('user', 'follower')]
  27.  
  28. class Blog(models.Model):
  29. """
  30. 博客信息
  31. """
  32. bid = models.BigIntegerField(primary_key=True)
  33. title = models.CharField(verbose_name='标题', max_length=128)
  34. site = models.CharField(verbose_name="个人博客前缀", max_length=32, unique=True)
  35. theme = models.CharField(verbose_name='博客主题', max_length=32)
  36. user = models.OneToOneField(to='UserInfo', to_field='uid', on_delete=models.SET_NULL, null=True)
  37.  
  38. class Category(models.Model):
  39. """博主个人文章分类"""
  40. cid = models.AutoField(primary_key=True)
  41. title = models.CharField(verbose_name='分类标题', max_length=32)
  42. blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='bid',
  43. on_delete=models.SET_NULL,null=True)
  44.  
  45. class Tag(models.Model):
  46. tid = models.AutoField(primary_key=True)
  47. title = models.CharField(verbose_name='标签名称',max_length=32)
  48. blog = models.ForeignKey(verbose_name="所属文章",to='Blog', to_field='bid',on_delete=models.SET_NULL,
  49. null=True)
  50.  
  51. class Article(models.Model):
  52. """文章信息表"""
  53. aid = models.BigAutoField(primary_key=True)
  54. title = models.CharField(verbose_name="文章标题", max_length=128)
  55. summary = models.CharField(verbose_name="文章简介", max_length=255)
  56. read_count = models.IntegerField(default=0)
  57. coumment_count = models.IntegerField(default=0)
  58. up_count = models.IntegerField(default=0)
  59. down_count = models.IntegerField(default=0)
  60. create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
  61. blog = models.ForeignKey(verbose_name="所属博客", to='Blog', to_field='bid',
  62. on_delete=models.SET_NULL, null=True)
  63. category = models.ForeignKey(verbose_name='文章类型', to='Category',to_field='cid',
  64. on_delete=models.SET_NULL, null=True)
  65. type_choices = [
  66. (1, "Python"),
  67. (2, "Linux"),
  68. (3, "OpenStack"),
  69. (4, "GoLang"),
  70. ]
  71. article_type = models.IntegerField(choices=type_choices, default=None)
  72. tags = models.ManyToManyField(
  73. to='Tag', through='ArticleToTag',
  74. through_fields=('article', 'tag')
  75. )
  76.  
  77. class ArticleToTag(models.Model):
  78. article = models.ForeignKey(verbose_name='文章', to='Article', to_field='aid',
  79. on_delete=models.SET_NULL, null=True)
  80.  
  81. tag = models.ForeignKey(verbose_name="标签", to='Tag', to_field='tid',
  82. on_delete=models.SET_NULL,null=True)
  83. class Meta:
  84. unique_together = [
  85. ('article', 'tag')
  86. ]
  87.  
  88. class ArticleDetail(models.Model):
  89. """文章详情表"""
  90. content = models.TextField(verbose_name="文章内容")
  91. article = models.OneToOneField(verbose_name="所属文章", to='Article',to_field='aid',
  92. on_delete=models.CASCADE)
  93.  
  94. class UpDown(models.Model):
  95. """文章顶/踩"""
  96. article = models.ForeignKey(verbose_name="文章", to='Article', to_field='aid',
  97. on_delete=models.CASCADE)
  98. user = models.ForeignKey(verbose_name='顶踩用户', to='UserInfo', to_field='uid',
  99. on_delete=models.CASCADE)
  100. up = models.BooleanField(verbose_name='是/否赞')
  101.  
  102. class Meta:
  103. """联合唯一"""
  104. unique_together = [('article', 'user')]
  105.  
  106. class Comment(models.Model):
  107. """评论表"""
  108. nid = models.BigAutoField(primary_key=True)
  109. content = models.CharField(verbose_name='评论内容', max_length=255)
  110. create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
  111.  
  112. reply = models.ForeignKey(verbose_name="回复已有评论",to="self",
  113. null=True, on_delete=models.SET_NULL)
  114. article = models.ForeignKey(verbose_name="对应的文章",
  115. to="Article",
  116. to_field='aid',
  117. on_delete=models.SET_NULL,
  118. null=True)

创建数据库:python manage.py makemigrations; python manage.py migrate

使用django + KindEditor 开发个人博客系统的更多相关文章

  1. Django完整的开发一个博客系统

    今天花了一些时间搭了一个博客系统,虽然并没有相关于界面的美化,但是发布是没问题的. 开发环境 操作系统:windows 7 64位 Django: 1.96 Python:2.7.11 IDE: Py ...

  2. Nuxt开发搭建博客系统

    nuxt.js第三方插件的使用?路由的配置pages目录自动生成路由layoutsdefault.vueerror.vueVuex的使用权限篇Mysqladvice nuxt.js 追求完美,相信大家 ...

  3. 转 Django+Bootstrap练习--我的类博客系统开发

    转自: http://blog.sina.com.cn/s/blog_7e050dc80102w312.html 本文记录了一个类博客网站从无到有的搭建过程,同时也是我入门django以及再次入门前端 ...

  4. Django开发个人博客入门学习经验贴

    [写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...

  5. nodejs--express开发个人博客(-)

    写完了入门笔记,开始进入开发阶段吧.基于上一节的内容,现在着手开发个人博客系统.先划分一下功能吧 /:首页 /login:登陆 /reg:注册 /post:发表文章 /logout:退出 首先规划一下 ...

  6. 如何快速部署国人开源的 Java 博客系统 Tale

    除了闷头专研技术之外,程序员还需要不断地写作进行技术积累,写博客是其中最重要的方式之一.商业博客平台不少,但是更符合程序员背景的方案,是自己开发一个博客平台或者使用开源的博客平台. 开源的博客平台多如 ...

  7. go语言打造个人博客系统(二)

    go语言打造个人博客系统(二)   在上篇文章go语言打造个人博客系统(一)中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发. 博客系统后端接口开发 路由测试 ht ...

  8. Halo-个人独立博客系统

    项目地址:https://github.com/halo-dev/halo 安装指导:https://halo.run/guide/   简介: Halo 是一款现代化的个人独立博客系统,给习惯写博客 ...

  9. 【django之博客系统开发】

    一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...

随机推荐

  1. Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS

    1.cephx认证和授权 1.1 CephX认证机制 Ceph使用cephx协议对客户端进行身份认证: 1.每个MON都可以对客户端进行身份验正并分发密钥, 不存在单点故障和性能瓶颈 2. MON会返 ...

  2. CF1445E four points

    我们不妨枚举四个点的移动方向. 那我们可以直接算出在该情况的最优的答案. #include<iostream> #include<cstdio> #include<alg ...

  3. Atcoder Grand Contest 002 F - Leftmost Ball(dp)

    Atcoder 题面传送门 & 洛谷题面传送门 这道 Cu 的 AGC F 竟然被我自己想出来了!!!((( 首先考虑什么样的序列会被统计入答案.稍微手玩几组数据即可发现,一个颜色序列 \(c ...

  4. MySQL-数据库多表关联查询太慢,如何进行SQL语句优化

    工作中我们经常用到多个left join去关联其他表查询结果,但是随着数据量的增加,一个表的数据达到百万级别后,这种普通的left join查询将非常的耗时. 举个例子:  现在porder表有 10 ...

  5. 动态滑动登陆框-Html+Css+Js

    动态滑动登陆框 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  6. C#多个标题头合并

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.RowType) ...

  7. 日常Java 2021/9/27

    题目: 在某个比赛中,有6个评委为参赛的选手打分,分数为1-100的随机整数.选手的最后得分为:除去最高分和最低分后的4个评委分值的平均值(不考虑小数部分). package m; import ja ...

  8. python格式化输出的两种方式对比

    1.%符号方法和format()函数方法 2.对比: 1 print('我今年%d岁' %22.125) 2 print('我今年{0:f}'.format(22.125)) 3 #报错 4 #槽中类 ...

  9. 【Reverse】初遇花指令

    解密花指令 全文参考了一个大师傅的blog:https://blog.csdn.net/zhangmiaoping23/article/details/38400393 介绍 花指令是对抗反汇编的有效 ...

  10. 转 关于HttpClient,HttpURLConnection,OkHttp的用法

    转自:https://www.cnblogs.com/zp-uestc/p/10371012.html 1 HttpClient入门实例 1.1发送get请求 1 2 3 4 5 6 7 8 9 10 ...