分析项目需求创建表:

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. kafka消费服务调优

    1.消费服务速度跟不上 2.top -H 观察是哪个线程最忙 3.多次使用jstack,看看最忙的那个线程在做什么

  2. JavaScirpt 认识DOM和BOM (汇总)

    将HTML代码分解为DOM节点层次图 DOM节点有: 1. 元素节点:上图中<html>.<body>.<p>等都是元素节点,即标签. 2. 文本节点:向用户展示的 ...

  3. 887. 求组合数 III(模板 卢卡斯定理)

    a,b都非常大,但是p较小 前边两种方法都会超时的  N^2 和NlongN  可以用卢卡斯定理  P*longN*longP     定义: 代码: import java.util.Scanner ...

  4. openlayers轨迹播放

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 在Ubuntu中建立软连接

    使用ln 命令 今天发现我的python3命令没了,出现了以下提示: /usr/bin/python3: bad interpreter: No such file or directory 查找原因 ...

  6. Docker安装部署es集群

    Docker安装部署es集群:环境准备:已安装docker的centos服务器一台1. 拉取es版本docker pull elasticsearch:5.6.82. 新建文件夹 数据挂载目录 和 配 ...

  7. hyper-v虚拟机不能访问外网的解决方案

    直接说解决方案,将虚拟机的一张网卡改为旧版网络适配器即可.具体原因还不可知. 延申一下,一般应该使用的交换机,是“外部”类型即可.

  8. 【基础问题】String 类型为什么是final类型

    关于为什么此类问题,都能列出12345...种种原因 已创建具体的值不可修改,故本身就是线程安全的,放到多线程中也不会担心被修改,支持在多线程中共享自身 . 因为字符串是不可变的,所以在它创建的时候H ...

  9. python2.6升级python2.7后,yum不能用了,如何解决

    背景: 跑python的case时候,发现log功能不好用,于是升级了python2.6-->python2.7 but,升级之后,发现yum命令不好用了.怎么办? 百度搜了一下,如何解决: 参 ...

  10. [CF1304C] Air Conditioner

    维护一区间 \([l,r]\) 人按照时间升序 考虑 \((l_i, h_i, t_i)\),当前的所有区间与这个区间取交 推到 \(t_{i+1}\) 时,所有区间的端点向两边扩张即可 注意把空掉的 ...