zoukankan      html  css  js  c++  java
  • Day 55 Django_BBS(博客项目)_分析与创建项目

    项目开发流程

    1 需求分析

    (1) 基于用户认证组件和Ajax实现登录验证(图片验证码)
    
    (2) 基于forms组件和Ajax实现注册功能
    
    (3) 设计系统首页(文章列表渲染)
    
    (4) 设计个人站点页面
    
    (5) 文章详情页
    
    (6) 实现文章点赞功能
    
    (7) 实现文章的评论
          ---文章的评论
          ---评论的评论
    
    (8) 富文本编辑框和防止xss攻击

    2 表结构设计

    博客系统的表关系:

    from django.db import models
    
    # Create your models here.
    
    from django.contrib.auth.models import AbstractUser
    
    class UserInfo(AbstractUser):
        """
        用户信息
        """
        nid = models.AutoField(primary_key=True)
        telephone = models.CharField(max_length=11, null=True, unique=True)
        avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    
        blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.username
    
    
    class Blog(models.Model):
        """
        博客信息
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='个人博客标题', max_length=64)
        site_name = models.CharField(verbose_name='站点名称', max_length=64)
        theme = models.CharField(verbose_name='博客主题', max_length=32)
    
        def __str__(self):
            return self.title
    
    
    class Category(models.Model):
        """
        博主个人文章分类表
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='分类标题', max_length=32)
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)
    
        def __str__(self):
            return self.title
    
    
    class Tag(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='标签名称', max_length=32)
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)
    
        def __str__(self):
            return self.title
    
    
    class Article(models.Model):
    
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=50, verbose_name='文章标题')
        desc = models.CharField(max_length=255, verbose_name='文章描述')
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        content = models.TextField()
    
        comment_count = models.IntegerField(default=0)
        up_count = models.IntegerField(default=0)
        down_count = models.IntegerField(default=0)
    
        user = models.ForeignKey(verbose_name='作者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
        category = models.ForeignKey(to='Category', to_field='nid', null=True, on_delete=models.CASCADE)
        tags = models.ManyToManyField(
            to="Tag",
            through='Article2Tag',
            through_fields=('article', 'tag'),
        )
    
    
    
        def __str__(self):
            return self.title
    
    
    class Article2Tag(models.Model):
        nid = models.AutoField(primary_key=True)
        article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid', on_delete=models.CASCADE)
        tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid', on_delete=models.CASCADE)
    
        class Meta:
            unique_together = [
                ('article', 'tag'),
            ]
    
        def __str__(self):
            v = self.article.title + "---" + self.tag.title
            return v
    
    
    class ArticleUpDown(models.Model):
        """
        点赞表
        """
    
        nid = models.AutoField(primary_key=True)
        user = models.ForeignKey('UserInfo', null=True, on_delete=models.CASCADE)
        article = models.ForeignKey("Article", null=True, on_delete=models.CASCADE)
        is_up = models.BooleanField(default=True)
    
        class Meta:
            unique_together = [
                ('article', 'user'),
            ]
    
    
    class Comment(models.Model):
        """
    
        评论表
    
        """
        nid = models.AutoField(primary_key=True)
        article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid', on_delete=models.CASCADE)
        user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
        content = models.CharField(verbose_name='评论内容', max_length=255)
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        parent_comment = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.content

     

    创建项目

    通过命令来创建一个django项目

    dajngo-admin startproject cnblog

    当然,也可以借助pycharmIDE来快速创建一个项目。

    数据库因为选择mysql,所以需要重新配置一下settings文件:

    创建django默认使用的是sqlite3
    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    
    # 配置mysql数据库连接参数
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'cnblog', # 要连接的数据库,连接前需要创建好
            'USER':'root',# 连接数据库的用户名
            'PASSWORD':'',# 连接数据库的密码
            'HOST':'127.0.0.1', # 连接主机,默认本级
            'PORT':3306 #  端口 默认3306
        }
    }

    接下里将我们设计好的模型表写入到项目的models文件中,然后数据库迁移

    python3 manage.py makemigrations
    python3 manage.py migrate

    这时项目可能会报一个错误:

    这是因为我们的模型表中UserInfo 表继承了原生用户表,即后面以Userinfo 表作为默认的用户表,但必须在配置文件中告诉django,所以需要添加配置:

    AUTH_USER_MODEL = "blog.UserInfo"

    其中,blog 是 userinfo 所在 app 的名称。

    然后再重新数据库迁移即可。

  • 相关阅读:
    kali linux 2019.1 替换burpsuite pro 1.7.37
    java反序列化漏洞实战
    我是一个997程序员
    清晨小悟
    vue webpack配置Error
    USSD 杂记
    WingMoney APP逆向,实现自动话费充值
    保持空杯心态
    解决python在命令行中运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"
    【转】Mac find 去除 “Permission denied” 信息的方法
  • 原文地址:https://www.cnblogs.com/ysging/p/12806795.html
Copyright © 2011-2022 走看看