django-bbs论坛总结

本文详述了使用Django构建论坛的过程,包括数据库设计、静态资源配置、用户注册登录、头像上传、主页与个人站点展示、文章详情及后台管理等功能。涉及forms组件、静态文件配置、Ajax交互、后端逻辑等关键环节。
摘要由CSDN通过智能技术生成
bbs流程图

##### ![](assets/bbs项目-2.png)

项目前期设计
数据库设计

数据库设计的时候要注意一定,用户表是直接继承auth模块的,所以需要以下的操作

#在models文件中
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
	pass
#然后再setitings中配置
#AUTH_USER_MODEL = "app名.models里面对应的模型表名"
AUTH_USER_MODEL = 'app01.Userinfo'

数据库中的是mysql 所以需要将数据库设置为mysql

#在settings中修改DATABASES中的配置
DATABASES = {
   
    'default': {
   
        'ENGINE': 'django.db.backends.mysql',#设置为mysql数据库
        'NAME': 'bbs',#数据库的名字
        'HOST':'127.0.0.1',#主机号
        "PORT":3306,#端口号
        'USER':'root',#用户名
        'PASSWORD':'123456'#密码
    }
}
#然后再__init__.py中配置如下
import pymysql
pymysql.install_as_MySQLdb()
数据库具体配置代码
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)
    create_time=models.DateField(auto_now_add=True)
    avatar=models.FileField(upload_to='avatar/',default='avatar/1.jpg')

    #用户表和个人站点 一对一
    blog=models.OneToOneField(to='Blog',null=True)

    class Meta:
        verbose_name_plural='用户表'

#个人站点 博客
class Blog(models.Model):
    site_name=models.CharField(max_length=32)
    site_title=models.CharField(max_length=32)
    #存css样式文件的路径
    theme=models.CharField(max_length=32)

    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=32)
    desc=models.CharField(max_length=256)
    #存大段文本
    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)
    tags=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()


class Commet(models.Model):
    user=models.ForeignKey(to='UserInfo')
    article=models.ForeignKey(to='Article')
    content=models.CharField(max_length=120)
    parent=models.ForeignKey(to='self',null=True)
    create_time=models.DateTimeField(auto_now_add=True,null=True)

系统静态资源文件配置static
#在这里存放的都是系统要用到的文件 比如前端页面的图片 css样式等

#先在总文件下创建一个static文件夹
#然后再settings中进行配置
STATIC_URL = '/static/'
# 静态文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
用户上传文件夹配置
#这个文件夹主要放的是用户上传的资源 这也就意味着开放了这个文件夹的接口,可以在网上直接访问到这个文件夹,所有开放需要谨慎

#首先 需要再settings中进行配置
#指定用户上传的静态文件储存位置
MEDIA_ROOT=os.path.join(BASE_DIR,'media')

#然后再urls.py中
from django.views.static import serve
from BBS import settings#这个BBS是项目的名字
url(r'^media/(?P<path>.*)', serve, {
   'document_root': settings.MEDIA_ROOT}),
##这种暴露给用户服务器资源的方法适用于所有的后端文件 所有在配置的时候慎重!!

admin配置
#为了方便在admin后台添加数据,需要将想在后台操作的表放在admin.py中
#可以将用户表名现实为自己定义的 也可以将显示的对象改为显示名字,这些都需要在models中配置,具体看上面的models
from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.UserInfo)
admin.site.register(models.Article)
admin.site.register(models.Article2Tag)
admin.site.register(models.Tag)
admin.site.register(models.Blog)
admin.site.register(models.Commet)
admin.site.register(models.UpAndDown)
admin.site.register(models.Category)
注册

注册主要用到了forms组件 方便信息的校验 以及头像上传

注册页面

在这里插入图片描述

更换头像

在这里插入图片描述

forms组件设置
#在应用下创建一个py文件 例(myforms.py)
#这里要注意的是email有一个invalid,用来判断邮箱的格式
from app01 import models
from django import forms

class MyForms(forms.Form):
    username=forms.CharField(max_length=8,min_length=3,label='用户名',error_messages={
   
        'max_length':'用户名最长8位',
        'min_length':'用户名最短3位',
        'required':'用户名不能为空'
    },widget=forms.TextInput(attrs={
   'class':'form-control'}))

    password=forms.CharField(max_length=8,min_length=3,label='密码',error_messages={
   
        'max_length':'密码最长8位',
        'min_length':'密码最短3位',
        'required':'密码不能为空'
    },widget=forms.PasswordInput(attrs={
   'class':'form-control'}))

    c_password = forms.CharField(max_length=8, min_length=3,label='确认密码', error_messages={
   
        'max_length': '确认密码最长8位',
        'min_length': '确认密码最短3位',
        'required': '确认密码不能为空'
    }, widget=forms.PasswordInput(attrs={
   'class':'form-control'}))

    email=forms.EmailField(label='邮箱',error_messages={
   
        'required':'邮箱不能为空',
        'invalid':'邮箱的格式不对'
    },widget=forms.EmailInput(attrs={
   'class': 'form-control'}))

forms组件的error还不是太完善 比如不能判断用户名是否存在,两次密码是否相同,所以需要使用forms组件的钩子函数

forms组件-钩子函数
#钩子函数分为局部钩子和全局钩子
#   局部钩子判断用户名是否重复
    def clean_username(self):
        username=self.cleaned_data.get('username')
        user=models.UserInfo.objects.filter(username=username)
        if user:
            self.add_error('username','用户已存在')
        else:
            return username

    #全局钩子判断2次密码是否一样
    def clean(self):
        password=self.cleaned_data.get('password')
        c_password=self.cleaned_data.get('c_password')
        if password==c_password:
            return self.cleaned_data
        else:
            self.add_error('c_passward','两次密码不一样')
注册前端代码
<!--这里的form表单是为了script的serializeArray(),获得form表单的数据-->
<form id="id_form" class="form-group">
            {% csrf_token %}
                {% for foo in Myforms %}

                    <label for="{
    { foo.auto_id }}">{
  { foo.label }}</label>
                    {
  { foo }}
                     <span id="id_span" class="error pull-right" style="color:red;"></span>
                {% endfor %}
            
            </form>
            <div class="form-group">
                <label for="id_myfile">头像
                    <img src="/static/img/1.jpg" alt="" width="80" name="img" id="id_img"
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值