利用Django写BBS项目

本文档详细介绍了如何使用Django 1.11.11和MySQL开发一个包含登录注册、文章功能、点赞点踩、评论、后台管理等多功能的BBS项目。项目特点包括Ajax登录注册、Markdown支持、XSS防护、文章分类和用户头像修改等。附带了源码链接。
摘要由CSDN通过智能技术生成

BBS项目介绍

开发工具:pycharm
python解释器版本:python3.8
Django版本:1.11.11

一、简介

此教材利用Django、MySQL实现以下功能:
多人博客(多用户,每个用户可以有自己的个人站点,编写自己的博客)
登录注册(登录有图片验证码,注册可以上传用户自定义头像)
登录注册用form组件进行校验和渲染页面,Ajax提交请求
每个用户都有个人站点(可以根据时间、分类、标签来过滤文章)
每个用户拥有后台管理(可以对文章、标签、分类进行增、删、改、查,新增文章使用Markdown文本编辑器,处理XSS攻击)
文章支持Markdown的代码语法高亮,支持一键复制
每个用户可以设置个人信息,修改个人站点背景、修改头像、修改密码
1篇文章可以有多个标签,但是只能拥有1个分类(不支持属于多个分类,但是不限制于标签)
在首页显示文章的用户头像、文章标题、文章摘要、发布时间、点赞数、评论数
每个已登录的用户都可以对文章进行点赞点踩(只能点其中1个,点后无法继续点击,无法撤销)
每篇文章都可以进行评论,每个评论可以有子评论(子评论也可以有子评论,以此类推)
管理员用户可以上传首页轮播图,可以管理用户(禁用、启用、设置为管理员、admin后台管理)

二、创建数据库与表

在配置文件中写入数据库配置,所有的配置信息都存放于settings.py文件中

DATABASES = {
   
    'default': {
   
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog01',    # 数据库名
        'HOST': '127.0.0.1',    # 主机IP(本地为127.0.0.1)
        'PORT': 3306,   # MySQL端口号:默认3306
        'USER':  'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }
}

创建数据库

create database blog01;

执行迁移命令

python manage.py makemigrations
python manage.py migrate

创建超级用户

python manage.py createsuperuser

在项目开发之前,首先要建立数据库,并确立表与表之间的关系,写数据库前先在__init__.py文件中导入pymysql模块
init.py

import pymysql
pymysql.install_as_MySQLdb()

搭建数据库,确立好表与表之间的关系,代码中已经做好注释
models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.


# 用户信息表
class UserInfo(AbstractUser):
    phone = models.BigIntegerField(null=True,blank=True)  # blank是用来告诉admin后台 该字段可以不填
    # avatar存的是用户头像文件路径 用户上传的头像会自动保存到avatar文件夹下
    avatar = models.FileField(upload_to='avatar/',default='avatar/default.jpg')
    create_time = models.DateField(auto_now_add=True)

# 用户信息与个人站点是一对一关系,外键建在个人站点
    blog = models.OneToOneField(to='Blog',null=True)

    class Meta:
        verbose_name_plural = '用户表'

    def __str__(self):
        return self.username


# 个人站点表
class Blog(models.Model):
    site_title = models.CharField(max_length=32)
    site_name = models.CharField(max_length=32)
    site_theme = models.CharField(max_length=255)

    class Meta:
        verbose_name_plural = '个人站点表'

    def __str__(self):
        return self.site_name


# 文章分类表
class Category(models.Model):
    name = models.CharField(max_length=32)
    blog = models.ForeignKey(to='Blog')

    def __str__(self):
        return self.name


# 文章标签表
class Tag(models.Model):
    name = models.CharField(max_length=32)
    blog = models.ForeignKey(to='Blog')

    def __str__(self):
        return self.name


# 文章表
class Article(models.Model):
    title = models.CharField(max_length=255)
    desc = models.CharField(max_length=255)
    content = models.TextField()  # 存大段文本
    create_time = models.DateField(auto_now_add=True)

    # 数据库优化字段
    comment_num = models.IntegerField(default=0)
    up_num = models.IntegerField(default=0)
    down_num = models.IntegerField(default=0)

    # 外键字段
    blog = models.ForeignKey(to='Blog',null=True)
    category = models.ForeignKey(to='Category',null=True)
    # 一篇文章可以有多个标签,一个标签可以有多篇文章  多对多
    tag = models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag'))

    def __str__(self):
        return self.title


# 文章与标签第三张表
class Article2Tag(models.Model):
    article = models.ForeignKey(to='Article')
    tag = models.ForeignKey(to='Tag')


# 点赞点踩表
class UpAndDown(models.Model):
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    is_up = models.BooleanField()  # 传布尔值  存0/1


# 文章评论表
class Comment(models.Model):
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    content = models.CharField(max_length=255)
    create_time = models.DateField(auto_now_add=True)
    parent = models.ForeignKey(to='self',null=True)

三、首页

创建数据与表单之后,接下来搭建BBS首页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#"> 首页</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">新闻 <span class="sr-only">(current)</span></a></li>
        <li class="active"><a href="#">博问 <span class="sr-only">(current)</span></a></li>
        <li class="active"><a href="#">专区 <span class="sr-only">(current)</span></a></li>
        <li class="active"><a href="#">闪存 <span class="sr-only">(current)</span></a></li>
        <li class="active"><a href="#">班级 <span class="sr-only">(current)</span></a></li>
        <li><a href="#">怀旧</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">发现 <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">园子</a></li>
            <li><a href="#">小组</a></li>
            <li><a href="#">收藏</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">招聘</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">找找看</a></li>
          </ul>
        </li>
      </ul>
      <form class="navbar-form navbar-left">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="代码改变世界">
        </div>
        <button type="submit" class="btn btn-default">搜索</button>
      </form>
      <ul class="nav navbar-nav navbar-right">
          {% if request.user.is_authenticated %}
                <li><a>{
  { request.user.username }}</a></li>
                <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">更多操作 <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="/edit_avatar/">修改头像</a></li>
            <li><a href="#" data-target=".bs-example-modal-lg" data-toggle="modal">修改密码</a></li>
            <li><a href="/backend/">后台管理</a></li>
            <li role="separator" class="divider">
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao阿文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值