利用Django写BBS项目

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"></li>
  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
本文将介绍如何使用Django框架构建一个简单的二手商城网站。 1. 环境准备 首先,我们需要安装Django。可以使用以下命令在终端中安装Django: ``` pip install Django ``` 安装完成后,可以通过以下命令检查是否安装成功: ``` django-admin --version ``` 2. 创建Django项目 使用以下命令创建一个新的Django项目: ``` django-admin startproject secondhandmall ``` 这将在当前目录下创建一个名为“secondhandmall”的Django项目。 3. 创建Django应用 在Django项目中,应用是独立的模块,可以包含业务逻辑和视图。使用以下命令创建一个新的Django应用: ``` cd secondhandmall python manage.py startapp mall ``` 这将在Django项目中创建一个名为“mall”的应用。 4. 配置数据库 在Django项目中,使用ORM(对象关系映射)来管理数据库。默认情况下,Django使用SQLite作为开发环境下的数据库,但我们可以配置其他类型的数据库,如MySQL或PostgreSQL。 在“secondhandmall/settings.py”文件中,可以找到以下部分: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ``` 这是SQLite的默认配置。如果要使用其他数据库,可以根据需要更改这些配置。 在这里,我们将使用SQLite作为数据库。 5. 定义模型 在Django中,模型是用于管理数据的对象。通过定义模型,我们可以创建数据表,并使用ORM来操作这些数据。 在“mall/models.py”文件中,我们定义了一个名为“Product”的模型,用于管理商品信息: ```python from django.db import models class Product(models.Model): name = models.CharField(max_length=200) description = models.TextField() price = models.DecimalField(max_digits=10, decimal_places=2) image = models.ImageField(upload_to='products/', null=True, blank=True) def __str__(self): return self.name ``` 在这个模型中,我们定义了商品的名称、描述、价格和图片等属性。其中,“CharField”和“TextField”用于存储文本数据,“DecimalField”用于存储数值数据,“ImageField”用于存储图片数据。 6. 创建数据库表 在定义完模型之后,需要使用以下命令创建数据库表: ``` python manage.py makemigrations python manage.py migrate ``` 这将创建数据库表,并将模型中定义的属性映射到数据库表的列中。 7. 创建视图 在Django中,视图用于处理HTTP请求,并返回HTTP响应。我们可以在“mall/views.py”文件中定义视图函数。 在这里,我们定义了一个名为“product_list”的视图函数,用于显示商品列表: ```python from django.shortcuts import render from .models import Product def product_list(request): products = Product.objects.all() return render(request, 'product_list.html', {'products': products}) ``` 在这个视图函数中,我们通过“Product.objects.all()”查询所有商品,并将它们传递给“product_list.html”模板。 8. 创建模板 在Django中,模板用于渲染HTML页面。可以在“mall/templates”目录下创建一个名为“product_list.html”的模板,用于显示商品列表: ```html {% extends 'base.html' %} {% block content %} <h1>商品列表</h1> <ul> {% for product in products %} <li>{{ product.name }} - {{ product.price }}</li> {% empty %} <li>暂无商品</li> {% endfor %} </ul> {% endblock %} ``` 在这个模板中,我们使用Django模板语言(template language)来显示商品列表。首先,我们通过“{% extends 'base.html' %}”继承了一个名为“base.html”的基础模板,然后使用“{% block content %}”和“{% endblock %}”定义了一个名为“content”的块。在这个块中,我们使用“{% for product in products %}”循环遍历所有商品,并使用“{{ product.name }}”和“{{ product.price }}”显示商品名称和价格。 9. 配置路由 在Django中,路由用于将URL映射到视图函数。可以在“secondhandmall/urls.py”文件中定义路由。 在这里,我们定义了一个名为“product_list”的路由,用于将“/products/”URL映射到“product_list”视图函数: ```python from django.contrib import admin from django.urls import path from mall.views import product_list urlpatterns = [ path('admin/', admin.site.urls), path('products/', product_list, name='product_list'), ] ``` 10. 运行应用 现在,我们已经完成了二手商城网站的基本构建。可以使用以下命令在本地启动开发服务器: ``` python manage.py runserver ``` 然后,在浏览器中访问“http://127.0.0.1:8000/products/”,即可查看商品列表。 11. 扩展应用 在这个基础上,我们可以继续扩展应用,例如添加商品详情页面、购物车功能、用户注册和登录等。 总结 本文介绍了如何使用Django框架构建一个简单的二手商城网站。通过定义模型、视图、模板和路由等组件,我们可以快速地构建一个功能完善的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiao阿文

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

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

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

打赏作者

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

抵扣说明:

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

余额充值