分析项目需求创建表:

STATICFILE_DIR = [
os.path.join(BASE_DIR,'static') #设置目录,bootstrip添加到目录中去,直接本地调用
]
# auth默认表
AUTH_USER_MODEL='app01.UserInfo' # 医用应用app01的userinfo表,不在使用默认的user表
from django.db import models
from django.contrib.auth.models import AbstractUser # Create your models here. # 定义用户表
class UserInfo(AbstractUser):
phone = models.BigIntegerField(null=True)
create_time = models.DateField(auto_now_add=True)
# 存储头像文件,把文件存放到avatar目录下,只存放路径信息
avatar = models.FileField(upload_to='avatar/', default='avatar/default.png') blog= models.OneToOneField(to='Blog',null=True) # 定义个人站点表
class Blog(models.Model):
# 站点名称
site_name = models.CharField(max_length=32)
# 站点标题
site_title = models.CharField(max_length=32)
# 个人站点样式文件,存该样式文件的路径
theme = models.CharField(max_length=64) # 文章分类表
class Category(models.Model):
name = models.CharField(max_length=64) blog = models.ForeignKey(to='Blog',null=True) # 文章标签表
class Tag(models.Model):
name = models.CharField(max_length=32) blog = models.ForeignKey(to='Blog',null=True) # 文章表
class Article(models.Model):
# 文章标题
title = models.CharField(max_length=64)
# 文章简介
desc = models.CharField(max_length=256)
# 文章详情,TextField存储大量文本
content = models.TextField()
# 文章创建时间
create_time= models.DateField(auto_now_add=True)
# 查询优化
# 评论数
comment_num = models.IntegerField()
# 点赞数
up_num = models.IntegerField()
# 点踩数
down_num = models.IntegerField() blog = models.ForeignKey(to='Blog',null=True)
category = models.ForeignKey(to='Category',null=True)
# 隐藏关联表
tags = models.ManyToManyField(to='Tag',through='Article2Tags',through_fields=('article','tag'))
# 创建article与tags的关系表第三张表
class Article2Tags(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 Commnet(models.Model):
# 用户字段
user=models.ForeignKey(to='UserInfo')
# 文章字段
article = models.ForeignKey(to='Article')
# 评论内容
content = models.CharField(max_length=256)
# 评论时间
create_time = models.DateField(auto_now_add=True)
# 父评论
parent = models.ForeignKey(to='self',null=True)

设置后台views.py

from django.shortcuts import render,HttpResponse
from app01 import myforms def register(reques):
    form_obj = myforms.MyForm()
return render(reques,'register.html',locals())

前端设置

<!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>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>注册页面</h1>
<form id="myform">
{% csrf_token %}
{% for foo in form_obj %}
<div class="form-group">
<label for="{{ foo.auto_id }}">{{ foo.label }}</label>
{{ foo }}
{# 加载对应输入框的提示信息#}
<span class="errors"></span>
</div>
{% endfor %}
</form>
<div class="form-group">
{# 点击图片也可以删除文件#}
<label for="id_myfile">头像
<img src="/static/img/default.png" alt="" width="60" style="margin-left: 10px">
</label>
<input type="file" name="myfile" id="id_myfile" style="display: none">
</div>
<button class="btn btn-primary pull-right">注册</button>
</div>
</div>
</div>
</body>
</html>

实现点击头像上传图片后在头像上显示上传的头像

<!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>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>注册页面</h1>
<form id="myform">
{% csrf_token %}
{% for foo in form_obj %}
<div class="form-group">
<label for="{{ foo.auto_id }}">{{ foo.label }}</label>
{{ foo }}
{# 加载对应输入框的提示信息#}
<span class="errors"></span>
</div>
{% endfor %}
</form>
<div class="form-group">
{# 点击图片也可以删除文件#}
<label for="id_myfile">头像
<img src="/static/img/default.png" alt="" width="80" style="margin-left: 10px" id="id_img">
</label>
<input type="file" name="myfile" id="id_myfile" style="display: none">
</div>
<button class="btn btn-primary pull-right">注册</button>
</div>
</div>
</div>
<script>
$('#id_myfile').change(function () {
//获取上传的文件对象
let fileobj=this.files[0];
//生成一个文件阅读器对象
let fileReader = new FileReader();
//将文件独放入文件阅读器中
fileReader.readAsDataURL(fileobj);
{#fileReader文件读取图片完成后再进行渲染#}
///动态显示头像
//等待文件加载完毕后在展示
fileReader.onload = function(){
//将读取出文件对象替换到img标签
$('#id_img').attr('src',fileReader.result)
}
}) </script>
</body>
</html>

往后端传送数据使用ajax

<!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>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>注册页面</h1>
<form id="myform">
{% csrf_token %}
{% for foo in form_obj %}
<div class="form-group">
<label for="{{ foo.auto_id }}">{{ foo.label }}</label>
{{ foo }}
{# 加载对应输入框的提示信息#}
<span class="errors pull-right" style="color: red"></span>
</div>
{% endfor %}
</form>
<div class="form-group">
{# 点击图片也可以删除文件#}
<label for="id_myfile">头像
<img src="/static/img/default.png" alt="" width="80" style="margin-left: 10px" id="id_img">
</label>
<input type="file" name="myfile" id="id_myfile" style="display: none">
</div>
<button class="btn btn-primary pull-right" id="id_submit">注册</button>
</div>
</div>
</div>
<script>
$('#id_myfile').change(function () {
//获取上传的文件对象
let fileobj=this.files[0];
//生成一个文件阅读器对象
let fileReader = new FileReader();
//将文件独放入文件阅读器中
fileReader.readAsDataURL(fileobj);
{#fileReader文件读取图片完成后再进行渲染#}
///动态显示头像
//等待文件加载完毕后在展示
fileReader.onload = function(){
//将读取出文件对象替换到img标签
$('#id_img').attr('src',fileReader.result)
}
});
//ajax提交数据
$('#id_submit').click(function () {
//生成一个formdata对象
let formData = new FormData();
//往formData中添加键值
$.each($('#myform').serializeArray(), function (index, obj) {
{#console.log(index,obj)#}
formData.append(obj.name,obj.value)
});
//手动添加文件数据
formData.append('myfile',$('#id_myfile')[0].files[0]);
$.ajax({
url:'',
type:'post',
//发送formData需要制定参数,数据不做处理
data:formData,
processData:false,
contentType:false,
success:function (data) {
console.log(data)
if (data.code == 100){
//跳转页面
location.href = data.url
} else{
$.each(data.msg,function (index,obj) {
console.log(index,obj)
let targetID = '#id_'+ index; //id_username,id_password
$(targetID).next().html(obj[0])
})
}
}
})
$('input').focus(function () {
$(this).next().html('')
})
})
</script>
</body>
</html>
from django.shortcuts import render
from app01 import myforms
from app01 import models
from django.http import JsonResponse # Create your views here.
def register(request):
back_dic={'code':100,'msg':''}
form_obj = myforms.MyForm()
if request.method == 'POST':
form_obj = myforms.MyForm(request.POST)
print(request.POST)
# 判断数据是否存在,存在返回true,不存在返回false
print(form_obj.errors) print(form_obj.is_valid())
if form_obj.is_valid():
data = form_obj.cleaned_data
# 将coonfirm_password去除掉
data.pop('confirm_password')
# 获取用户上传头像文件
file_obj = request.FILES.get('myfile')
# 判断用户是否上传了自己的头像
if file_obj:
# 数据库中头像路径字段是avator
data['avatar']=file_obj
models.UserInfo.objects.create_user(**data)
back_dic['msg']= '注册成功'
back_dic['url']='/login/'
else:
back_dic['code']=101
# 错误信息返回前台
back_dic['msg']=form_obj.errors
return JsonResponse(back_dic)
return render(request, 'register.html', locals())

实现效果:前台输入信息完成注册,输入错误提示红色信息,再次点击窗扣错误信息消失

bbs论坛注册功能(1)的更多相关文章

  1. BBS论坛 注册功能

    三.注册功能 # views.py文件 def register(request): back_dic = {'code': 100, 'msg': ''} form_obj = myforms.My ...

  2. BBS论坛 登录功能

    四.登录功能 前端页面html代码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  3. python第一百三十天 ---简单的BBS论坛

    简单的BBS论坛 实现功能 git仓库地址:https://github.com/uge3/BBS 1.整体参考“抽屉新热榜” + “博客园” 2.实现不同论坛版块 3.帖子列表展示 4.个人博客主页 ...

  4. Django项目 BBS论坛

    BBS论坛 一.项目表分析 二.自定义form组件 三.注册功能 四.BBS论坛 登录功能

  5. BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现

    1.BBS项目之注册功能通过forms验证 from django import forms from blog.models import User from django.contrib.auth ...

  6. bbs论坛登录相关功能(2)

    昨天把注册功能页面做出来,接下来就是登录页面 登录功能: 1,用户账号,密码后台效验,错误信息在登录按钮右边显示 2.验证码,根据图片生成,点击图片刷新产生新的验证码 修改密码 注册 先把前端页面lo ...

  7. BBS注册功能

    BBS注册功能 一.后端 1.组件校验数据 """ @author RansySun @create 2019-11-03-11:35 """ ...

  8. BBS登录与注册功能

    登录功能 视图函数 def my_login(request): if request.method == 'GET': return render(request, 'login.html') el ...

  9. Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点

    开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...

随机推荐

  1. mnist手写数字问题初体验

    上一篇我们提到了回归问题中的梯度下降算法,而且我们知道线性模型只能解决简单的线性回归问题,对于高维图片,线性模型不能完成这样复杂的分类任务.那么是不是线性模型在离散值预测或图像分类问题中就没有用武之地 ...

  2. linux命令su,sudo 使用和区别

    1- sudo 与 su 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升的权限运行单个命 ...

  3. 文件流之输入输出(类似于freopen重定向)

    利用标准文件操作函数进行数据的输入输出,所用函数均在stdio.h中,类似于freopen重定向文件. 该方法的思路是: (1)建立文件指针 (2)打开文件,将文件指针指向打开的文件,并决定打开的文件 ...

  4. sklearn.metrics中的评估方法

    https://www.cnblogs.com/mindy-snail/p/12445973.html 1.confusion_matrix 利用混淆矩阵进行评估 混淆矩阵说白了就是一张表格- 所有正 ...

  5. 注解配置springMVC

    在随笔“springMVC项目配置文件”的基础上,进行优化,使用注解配置,控制器类得以简化: 一.注解配置springMVC 1.在HelloController类中,去除实现的Controller接 ...

  6. 0级搭建类011-Oracle Linux 7.x安装(OEL 7.7) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  7. 【LInux01】学习Linux课程体系

    知识 =>技能   需要大量的练习  相当于复盘 要有成就感 在一个领域深挖,再迁移到其他领域 1.两周以后的知识留存率: 主动学习: 动手实践:40% 讲给别人听:70% 写博客:是写教程,便 ...

  8. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  9. tcolorbox 宏包简明教程

    嗯,我消失好几天了.那么,我都在做什么呢?没错,就是写这篇文章了.这篇文章写起来着实有些费神了.于是,如果你觉得这篇文章对你有帮助,不妨扫描文末的二维码,适量赞助一下哦~! tcolorbox 宏包是 ...

  10. SQL语句中count(1)count(*)count(字段)用法的区别(转)

    SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...