bbs流程图
项目前期设计
数据库设计
数据库设计的时候要注意一定,用户表是直接继承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"