zoukankan      html  css  js  c++  java
  • 使用django + KindEditor 开发个人博客系统

    前奏小知识

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

    django框架部分

    1. 数据结构models

    from django.db import models
    
    # Create your models here.
    
    
    # 大分类表
    class Category(models.Model):
        caption = models.CharField(max_length=32)
    
    
    # 文章类型表
    class ArticleTyp(models.Model):
        caption = models.CharField(max_length=32)
    
    
    # 创建一个文章表,设置标题和内容;文章大分类小分类 四个字段
    class Article(models.Model):
        title = models.CharField(max_length=1024)
        content = models.CharField(max_length=30720)
        category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL)
        article_type = models.ForeignKey(ArticleTyp, null=True, on_delete=models.SET_NULL)
        # 测试使用内存级别选项,不存储于数据库
        # type_choice = (
        #     (1, "Python"),
        #     (2, "JavaScript"),
        #     (3, "前端"),
        # )
        # article_type_id = models.IntegerField(choices=type_choice)

    2. url

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

    3.views 

    from django.shortcuts import render
    
    from django.views import View
    from  Blog import models
    # Create your views here.
    
    
    class Article(View):
        def get(self, request, *args, **kwargs):
            # 查询时的过滤条件
            condition = {}
            for k, v in kwargs.items():
                # 渲染html文件中判断是否为选中分类:url参数为字符串;数据库查询出来的id为int类型
                # 转换为同一个类型,渲染模板时做比较
                kwargs[k] = int(v)
                if v == '0':  # 如果为零,查询条件中就不传入此参数
                    pass
                else:
                    condition[k] = v
    
            print(condition)
            article_type_list = models.ArticleTyp.objects.all()
            # models 中使用内存级别字段
            # article_type_list = models.Article.type_choice
            category_list = models.Category.objects.all()
            result = models.Article.objects.filter(**condition)
            return render(
                request,
                # 'blog/article.html',
                'blog/article_simple_tag.html',
                {'article_type_list': article_type_list,
                 'category_list': category_list,
                 'articles': result,
                 'condition_dict': kwargs}
            )

    4. models 数据库类型核对

    from django.db import models
    
    # Create your models here.
    
    
    # 大分类表
    class Category(models.Model):
        caption = models.CharField(max_length=32)
    
    
    # 文章类型表
    class ArticleTyp(models.Model):
        caption = models.CharField(max_length=32)
    
    
    # 创建一个文章表,设置标题和内容;文章大分类小分类 四个字段
    class Article(models.Model):
        title = models.CharField(max_length=1024)
        content = models.CharField(max_length=30720)
        category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL)
        article_type = models.ForeignKey(ArticleTyp, null=True, on_delete=models.SET_NULL)
        # 测试使用内存级别选项,不存储于数据库
        # type_choice = (
        #     (1, "Python"),
        #     (2, "JavaScript"),
        #     (3, "前端"),
        # )
        # article_type_id = models.IntegerField(choices=type_choice)

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

    templatetags/condition_filter.py

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    #  @Time: 2020/8/8 11:17
    #  @Author:zhangmingda
    #  @File: condition_filter.py
    #  @Software: PyCharm
    #  Description:
    
    from django import template
    from django.utils.safestring import mark_safe
    
    
    register = template.Library()
    
    
    @register.simple_tag
    def filter_all(condition_dict, all_condition):
        article_type_id = condition_dict["article_type_id"]
        category_id = condition_dict["category_id"]
    
        all_ret = ""
        if all_condition == "article_type_id":
            if article_type_id == 0:
                all_ret = '<a href="/article/-0-%s.html" class="condition active">全部</a>' % category_id
            else:
                all_ret = '<a href="/article/-0-%s.html" class="condition ">全部</a>' % category_id
        if all_condition == "category_id":
            if category_id == 0:
                all_ret = '<a href="/article/-%s-0.html" class="condition active">全部</a>' % article_type_id
            else:
                all_ret = '<a href="/article/-%s-0.html" class="condition ">全部</a>' % article_type_id
    
        all_ret = mark_safe(all_ret)
    
        return all_ret
    
    @register.simple_tag
    def filter_article_type(condition_dict, article_type_list ):
        """
                {% if condition_dict.article_type_id == article_type.id %}
                    <a href="/article/-{{ article_type.id }}-{{ condition_dict.category_id }}.html" class="condition active">{{ article_type.caption }}</a>
                {% else %}
                    <a href="/article/-{{ article_type.id }}-{{ condition_dict.category_id }}.html" class="condition">{{ article_type.caption }}</a>
                {% endif %}
        :return:
        """
        a_tag_list = []
        for article_type in article_type_list:
    
            article_type_id = article_type.id
            # models 中使用内存级别字段
            # article_type_id = article_type[0]
    
            if condition_dict["article_type_id"] == article_type_id:
                ret = '<a href="/article/-{article_type_id}-{category_id}.html" class="condition active">{article_type_caption}</a>'.format(
                    article_type_id=article_type_id,
                    category_id=condition_dict.get('category_id'),
                    article_type_caption=article_type.caption,
                    # models 中使用内存级别字段
                    # article_type_caption=article_type[1]
                )
            else:
                ret = '<a href="/article/-{article_type_id}-{category_id}.html" class="condition ">{article_type_caption}</a>'.format(
                    article_type_id=article_type_id,
                    category_id=condition_dict.get('category_id'),
                    article_type_caption=article_type.caption,
                    # models 中使用内存级别字段
                    # article_type_caption=article_type[1]
                )
            a_tag_list.append(ret)
        all_a_tag = ''.join(a_tag_list)
        return mark_safe(all_a_tag)
    
    
    
    
    @register.simple_tag
    def filter_category(condition_dict, category_list ):
        """
            {% for category in category_list %}
                {% if condition_dict.category_id == category.id %}
                    <a href="/article/-{{ condition_dict.article_type_id }}-{{ category.id }}.html" class="condition active" >{{ category.caption }}</a>
                {% else %}
                    <a  href="/article/-{{ condition_dict.article_type_id }}-{{ category.id }}.html" class="condition" >{{ category.caption }}</a>
                {% endif %}
            {% endfor %}
        :param condition_dict: 
        :param category_list: 
        :return: 
        """
        filter_category_tag_list = []
        for category in category_list:
            category_id = category.id
            if condition_dict.get("category_id") == category_id:
                category_a_tag = '<a href="/article/-%s-%s.html" class="condition active" >%s</a>' % (condition_dict.get("article_type_id"), category_id, category.caption )
            else:
                category_a_tag = '<a href="/article/-%s-%s.html" class="condition " >%s</a>' % (condition_dict.get("article_type_id"), category_id, category.caption )
            filter_category_tag_list.append(category_a_tag)
        ret = ''.join(filter_category_tag_list)
        return mark_safe(ret)

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

    {% load condition_filter %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .condition{
                display: inline-block;
                border: 1px solid #dddddd;
                padding: 3px 5px;
                margin: 5px;
            }
            .condition.active {
                background-color: #843534;
            }
        </style>
    </head>
    <body>
        <h1>过滤条件</h1>
        <div>
            <!--使用simpletag自定义函数生成HTML标签-->    
            {% filter_all condition_dict "article_type_id" %}
            {% filter_article_type condition_dict article_type_list %}
        </div>
        <div>
            <!--使用simpletag自定义函数生成HTML标签-->
            {% filter_all condition_dict "category_id" %}
            {% filter_category condition_dict category_list %}
        </div>
        <h1>查询结果</h1>
        <ul>
            {% for article in articles %}
                <li> {{ article.id }} - {{ article.title }}</li>
            {% endfor %}
        </ul>
    </body>
    </html>

    正式来一发

    数据库设计

    """
    
    用户表:UserInfo
        nid             自增列
        username        用户名 不可重复
        password        密码
        nickname        昵称
        email           邮箱
        avtar           头像
        create_time     创建时间
        fans            粉丝们 ---- 多对多表 外键自己
    
    个人博客信息表:Blog
        nid     自增列
        title   个人博客标题
        site    个人博客前缀
        theme   博客主题
        user    博客一对一 对应用户id
    
    互粉关系表:UserFans
        user        博主 外键到用户表
        folower     粉丝  外键到用户表
        class Meta: 不可重复
            unique_together = [('user', 'follower')]
    
    文章分类表(博主个人):Category
        nid     自增
        title   标题
        blog    所属博客 -- 外键到博客表
    
    文章标签表:Tag
        nid         自增主键
        title       标签名称
        blog        所属博客    - 外键到博客表-主键
    
    文章内容表:ArticleDetail
        content         文章内容
        aritcle         所属文章 - 外键到文章信息表
    
    顶/踩 统计:UpDown
        aritcle         对应文章 - 外键到 文章表的主键
        user            用户 外键到用户表主键
        up              顶或者是踩:布尔值即可
        class Meta:     # 两个字段合并唯一 :顶或者踩,一篇文章只能顶或者踩一次
            unique_together = [('article', 'user')]
    
    评论表:Comment
        nid         自增主键
        content     内容
        create_time 创建时间
        reply       回复/评论   对自己表中已有的数据:self
        article     被评论的文章   -  外键到文章表主键
        user        评论着 - 外键到用户表 主键
    
    文章表:Article
        nid         自增主键
        title       文章标题
        summary     文章简介
        read_count  阅读量
        comment_count   评论数量
        up_count        点赞数量
        down_count      踩量
        create_time     创建时间
        blog            所属博客
        category        文章类型
        type_choices    语言分类选项
        article_type    语言分类
        tags            标签 多对多 指定多对多的第三张表名Article2Tag
    
    文章-标签多对多表:Article2Tag
        article         文章 外键到文章表主键
        tag             标签 外键到标签表主键
        class Meta:     标签&文章一起,不得重复
            unique_together = [('article', 'tag')]
    
    """

    数据库表结构代码

    models.py

    from django.db import models
    
    # Create your models here.
    
    class UserInfo(models.Model):
        """
        用户表
        """
        uid = models.BigAutoField(primary_key=True)
        username = models.CharField(max_length=32, unique=True, verbose_name="用户名")
        password = models.CharField(verbose_name='密码', max_length=64)
        nickname = models.CharField(verbose_name='昵称', max_length=32)
        email = models.EmailField(verbose_name='邮箱', unique=True)
        avatar = models.ImageField(verbose_name='头像')
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        fans = models.ManyToManyField(verbose_name='粉丝们',
                                      to='UserInfo',
                                      through='UserFans',
                                      through_fields=('user', 'follower'))
    
    class UserFans(models.Model):
        """互粉关系表"""
        user = models.ForeignKey(verbose_name='博主', to=UserInfo, to_field='uid', related_name='users', on_delete=models.SET_NULL, null=True)
        follower = models.ForeignKey(verbose_name='粉丝', to=UserInfo, to_field='uid', related_name='followers', on_delete=models.SET_NULL, null=True)
        class Meta:
            unique_together = [('user', 'follower')]
    
    class Blog(models.Model):
        """
        博客信息
        """
        bid = models.BigIntegerField(primary_key=True)
        title = models.CharField(verbose_name='标题', max_length=128)
        site = models.CharField(verbose_name="个人博客前缀", max_length=32, unique=True)
        theme = models.CharField(verbose_name='博客主题', max_length=32)
        user = models.OneToOneField(to='UserInfo', to_field='uid', on_delete=models.SET_NULL, null=True)
    
    
    class Category(models.Model):
        """博主个人文章分类"""
        cid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='分类标题', max_length=32)
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='bid',
                                 on_delete=models.SET_NULL,null=True)
    
    
    class Tag(models.Model):
        tid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='标签名称',max_length=32)
        blog = models.ForeignKey(verbose_name="所属文章",to='Blog', to_field='bid',on_delete=models.SET_NULL,
                                 null=True)
    
    
    class Article(models.Model):
        """文章信息表"""
        aid = models.BigAutoField(primary_key=True)
        title = models.CharField(verbose_name="文章标题", max_length=128)
        summary = models.CharField(verbose_name="文章简介", max_length=255)
        read_count = models.IntegerField(default=0)
        coumment_count = models.IntegerField(default=0)
        up_count = models.IntegerField(default=0)
        down_count = models.IntegerField(default=0)
        create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
        blog = models.ForeignKey(verbose_name="所属博客", to='Blog', to_field='bid',
                                 on_delete=models.SET_NULL, null=True)
        category = models.ForeignKey(verbose_name='文章类型', to='Category',to_field='cid',
                                     on_delete=models.SET_NULL, null=True)
        type_choices = [
            (1, "Python"),
            (2, "Linux"),
            (3, "OpenStack"),
            (4, "GoLang"),
        ]
        article_type = models.IntegerField(choices=type_choices, default=None)
        tags = models.ManyToManyField(
            to='Tag', through='ArticleToTag',
            through_fields=('article', 'tag')
        )
    
    
    class ArticleToTag(models.Model):
        article = models.ForeignKey(verbose_name='文章', to='Article', to_field='aid',
                                    on_delete=models.SET_NULL, null=True)
    
        tag = models.ForeignKey(verbose_name="标签", to='Tag', to_field='tid',
                                on_delete=models.SET_NULL,null=True)
        class Meta:
            unique_together = [
                ('article', 'tag')
            ]
    
    
    class ArticleDetail(models.Model):
        """文章详情表"""
        content = models.TextField(verbose_name="文章内容")
        article = models.OneToOneField(verbose_name="所属文章", to='Article',to_field='aid',
                                       on_delete=models.CASCADE)
    
    class UpDown(models.Model):
        """文章顶/踩"""
        article = models.ForeignKey(verbose_name="文章", to='Article', to_field='aid',
                                    on_delete=models.CASCADE)
        user = models.ForeignKey(verbose_name='顶踩用户', to='UserInfo', to_field='uid',
                                 on_delete=models.CASCADE)
        up = models.BooleanField(verbose_name='是/否赞')
    
        class Meta:
            """联合唯一"""
            unique_together = [('article', 'user')]
    
    
    class Comment(models.Model):
        """评论表"""
        nid = models.BigAutoField(primary_key=True)
        content = models.CharField(verbose_name='评论内容', max_length=255)
        create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    
        reply = models.ForeignKey(verbose_name="回复已有评论",to="self",
                                  null=True, on_delete=models.SET_NULL)
        article = models.ForeignKey(verbose_name="对应的文章",
                                    to="Article",
                                    to_field='aid',
                                    on_delete=models.SET_NULL,
                                    null=True)

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

  • 相关阅读:
    简单理解Vue中的nextTick
    vue-router路由元信息及keep-alive组件级缓存
    Webpack配置区分开发环境和生产环境
    理解Vue.mixin,利用Vue.mixin正确的偷懒
    HTML5实现首页动态视频背景
    vue-router钩子函数实现路由守卫
    Vue路由(vue-router)详细讲解指南
    一文轻松搞懂Vuex
    利用HBuilder打包Vue开发的webapp为app
    WPF中剪贴板操作Clipboard
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/13458760.html
Copyright © 2011-2022 走看看