利用Form组件和ajax实现的注册

一、注册相关的知识点

1、Form组件

我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放

2、局部钩子函数

 def clean_username(self):
username = self.cleaned_data.get("username")
valid = models.UserInfo.objects.filter(username = username).first()
if valid:
raise ValidationError("用户名已存在")
return username

3、全局钩子函数

#自定义全局钩子:验证两次密码是否一致
def clean(self):
if self.cleaned_data.get("password") == self.cleaned_data.get("password_again"):
return self.cleaned_data
else:
raise ValidationError("两次密码不一致")

4、 jQuery的属性操作相关的

attr:
一个参数是获取属性的值,两个参数是设置属性值
removeAttr(属性名):
删除属性值
prop:
适应于属性的返回值是布尔类型的(单选,反选,取消的例子)
removePorp:
删除属性的值

5、循环的两种方式:

$.each(数组/对象,function(i,v){})
$("div").each(function(i,v){})

6、css中的三种隐藏:

1、display:none  隐藏所有内容
2、visibility:hidden 隐藏内容
3、overflow:hidden 隐藏溢出内容
三者都是用来隐藏的:
区别在于:
visibility虽然隐藏了,但是被隐藏的内容依然占据这空间,这段隐藏了的内容却保留空间的位置会在网页中显示空白
而display:隐藏了不占用空间
我们在注册的时候不用display:none,不然选择文件的那个功能就没有了,我们可以吧透明度

7、提交二进制数据用FormData

var formData=new FormData();
formData.append("username",$("#id_username").val());
formData.append("email",$("#id_email").val());
formData.append("tel",$("#id_tel").val());
formData.append("password",$("#id_password").val());
formData.append("password_again",$("#id_password_again").val());
formData.append("avatar_img",$("#avatar")[0].files[0]);

记得要加上

contentType:false
processData:false

8、可以用下面的方法判断是什么请求

if request.ajax():    #如果ajax请求
if request,method=="POST": #如果是POST请求

9、上传文件有一个固定的配置参数media,和static相似 但又不同

步骤如下:

- 首先在settings中配置:

# ============media配置===============
MEDIA_URL="/media/" #别名
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","uploads") #具体路径

- 在url中配置

url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

用处:

用处一:
----- avatar = models.FileField(verbose_name='头像', upload_to='avatar', default="/avatar/default.png")
会把接收的文件放在media指代的路径与upload_to的拼接:BASE_DIR+blog+media+uploads+avatar/a.png
avatar字段在数据库中保存的是:avatar/a.png

用处二:

------ <img src="/media/avatar/a.png">

如果上传成功会把图片自动保存在这里

10、头像图片预览

   //头像预览
$(".avatar_file").change(function () {
var ele_file = $(this)[0].files[0]; //当前选中的文件
var reader = new FileReader();
reader.readAsDataURL(ele_file); //对应找到打开的url
reader.onload=function () {
{# 方式一#}
$(".avatar_img").attr("src",this.result) ; //this.result是上面找到的url
{# 方式二#}
{# $(".avatar_img")[0].src=this.result; //设置图片属性#}
}
})

11、form自动生成的错误信息

当你定义了全局钩子的时候,而且正好出现你的那个全局钩子函数中的错(比如两次密码输入不一致),这样你打印错误信息的时候

会有一个__all__对象,这个就是你设置的全局钩子生成的。

所以还要单独判断一下,现在全局钩子只有一个,你可以这样判断,但是,当全局钩子多的时候就得一个一个分开来判断

  if (i=="__all__"){
$("#id_password_again").after($span)
}

二、具体实现注册操作

urls.py

 from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf import settings
from django.views.static import serve
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.login),
url(r'^index/$', views.index),
url(r'^get_vaildCode_img/$', views.get_vaildCode_img),
url(r'^log_out/$', views.log_out), url(r'^register/$', views.register),
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]

urls.py

views.py

from django.shortcuts import render,HttpResponse

# Create your views here.
from blog import models import json def login(reqeust):
if reqeust.is_ajax(): res={"user":None,"msg":None}
user=reqeust.POST.get("user")
pwd=reqeust.POST.get("pwd")
valid=reqeust.POST.get("valid")
print(reqeust.POST)
random_str=reqeust.session.get("random_str")
if valid.upper()==random_str.upper(): from django.contrib import auth user=auth.authenticate(username=user,password=pwd)
if user:
res["user"]=user.username
else:
res["msg"]="用户名或者密码错误"
else:
res["msg"]="验证码失败" return HttpResponse(json.dumps(res)) return render(reqeust,"login.html") def valid_img(request): # 方式1:
# with open("egon.jpg","rb") as f:
# data=f.read() # 方式2:
import random
def get_random_color():
return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
# from PIL import Image
# image=Image.new("RGB",(250,36),color=get_random_color())
# f=open("validcode.png","wb")
# image.save(f,"png")
#
# with open("validcode.png","rb") as f:
# data=f.read() # 方式3:
# from PIL import Image
# from io import BytesIO
# image=Image.new("RGB",(250,36),color=get_random_color())
# f=BytesIO()
# image.save(f,"png")
# data=f.getvalue() # 方式4:
from PIL import Image from PIL import ImageDraw,ImageFont
from io import BytesIO
image=Image.new("RGB",(250,36),color=get_random_color()) draw=ImageDraw.Draw(image)
font = ImageFont.truetype("blog/static/font/kumo.ttf", size=32) random_str=""
for i in range(5):
random_num=str(random.randint(0,9))
random_low_alpha=chr(random.randint(97,122))
random_up_alpha=chr(random.randint(65,90))
random_char=random.choice([random_num,random_low_alpha,random_up_alpha])
draw.text((20+i*40,0),random_char,get_random_color(),font=font)
random_str+=random_char print(random_str) request.session["random_str"]=random_str # 噪点噪线
# width=250
# height=36
# for i in range(10):
# x1=random.randint(0,width)
# x2=random.randint(0,width)
# y1=random.randint(0,height)
# y2=random.randint(0,height)
# draw.line((x1,y1,x2,y2),fill=get_random_color())
#
# for i in range(100):
# draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
# x = random.randint(0, width)
# y = random.randint(0, height)
# draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())
f=BytesIO()
image.save(f,"png")
data=f.getvalue()
return HttpResponse(data) from django import forms
class UserForm(forms.Form):
user=forms.CharField(min_length=3)
pwd=forms.CharField()
repeat_pwd=forms.CharField()
email=forms.EmailField() def clean_user(self):
users=self.cleaned_data.get("user")
user_info=models.UserInfo.objects.filter(username=users).first()
if user_info:
raise forms.ValidationError("用户已存在")
else:
return users def clean(self): print("clean",self.cleaned_data) if self.cleaned_data.get("pwd")!=self.cleaned_data.get("repeat_pwd"):
raise forms.ValidationError("两次输入密码不一致,请重新输入")
else:
return self.cleaned_data.get("pwd") def reg(request):
if request.method=="POST":
form=UserForm(request.POST)
res={"user":None,"msg":None}
if form.is_valid():
user=form.cleaned_data.get("user")
pwd=form.cleaned_data.get("pwd")
email=form.cleaned_data.get("email")
avatar_img=request.FILES.get("avatar_img")
cre_user=models.UserInfo.objects.create_user(username=user,password=pwd,email=email,avatar=avatar_img)
res["user"]=form.cleaned_data.get("user")
else:
res["msg"]=form.errors
return HttpResponse(json.dumps(res)) return render(request,"reg.html")

views

template

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blog</title>
<link rel="stylesheet" href="/static/bs/css/bootstrap.min.css">
<script src="/static/js/jquery-3.2.1.min.js"></script>
<style>
.error{
color: red;
margin-left: 20px;
}
</style>
</head>
<body> <h3>登录页面</h3>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form enctype="application/x-www-form-urlencoded">
{% csrf_token %}
<div class="form-group">
<label for="">用户名</label>
<input type="text" id="user" class="form-control">
</div>
<div class="form-group">
<label for="">密码</label>
<input type="password" id="pwd" class="form-control">
</div> <div class="form-group">
<label for="">验证码</label>
<div class="row">
<div class="col-md-6">
<input type="text"id="valid" class="form-control">
</div>
<div class="col-md-6">
<img width="250" height="36" src="/valid_img/" alt="" class="valid_img">
</div>
</div> </div>
<input type="button" value="登陆" class="login_btn btn btn-primary">
<a href="/reg/" class="pull-right">注册</a>
<span class="error"></span> </form>
</div>
</div>
</div> <script>
// 登录验证
$(".login_btn").click(function () { $.ajax({
url:"",
data:{
user:$("#user").val(),
pwd:$("#pwd").val(),
valid:$("#valid").val(),
csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
},
type:"post",
success:function (data) {
console.log(data);
var data=JSON.parse(data);
if(data.user){ }else{
$(".error").html(data.msg) }
}
}) }); // 验证码局部刷新 $(".valid_img").click(function () { $(this)[0].src+="?"
}) </script> </body>
</html>

login

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blog</title>
<link rel="stylesheet" href="/static/bs/css/bootstrap.min.css">
<script src="/static/js/jquery-3.2.1.min.js"></script>
<style>
.error{
color: red;
margin-left: 20px;
}
</style>
</head>
<body> <h3>登录页面</h3>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form enctype="application/x-www-form-urlencoded">
{% csrf_token %}
<div class="form-group">
<label for="">用户名</label>
<input type="text" id="user" class="form-control">
</div>
<div class="form-group">
<label for="">密码</label>
<input type="password" id="pwd" class="form-control">
</div> <div class="form-group">
<label for="">验证码</label>
<div class="row">
<div class="col-md-6">
<input type="text"id="valid" class="form-control">
</div>
<div class="col-md-6">
<img width="250" height="36" src="/valid_img/" alt="" class="valid_img">
</div>
</div> </div>
<input type="button" value="登陆" class="login_btn btn btn-primary">
<a href="/reg/" class="pull-right">注册</a>
<span class="error"></span> </form>
</div>
</div>
</div> <script>
// 登录验证
$(".login_btn").click(function () { $.ajax({
url:"",
data:{
user:$("#user").val(),
pwd:$("#pwd").val(),
valid:$("#valid").val(),
csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
},
type:"post",
success:function (data) {
console.log(data);
var data=JSON.parse(data);
if(data.user){ }else{
$(".error").html(data.msg) }
}
}) }); // 验证码局部刷新 $(".valid_img").click(function () { $(this)[0].src+="?"
}) </script> </body>
</html>

reg

 

效果截图

 
 
 

Django-利用Form组件和ajax实现的注册的更多相关文章

  1. Django【第23篇】:利用Form组件和ajax实现的注册

    利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...

  2. 利用Form组件和ajax实现的注册

    一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2 ...

  3. python框架之Django(10)-Form组件

    介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...

  4. 〖Python〗-- Django的Form组件

    [Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...

  5. django 使用form组件提交数据之form表单提交

    django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...

  6. 【Django】Form组件

    目录 Form组件介绍 常用字段与插件 Form组件中所有内置字段 从数据库中获取数据 校验示例 检验手机号是否合法 方式一(基本操作) 方式二(自定义验证规则) 方式三(利用钩子) 验证密码一致性 ...

  7. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  8. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  9. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

随机推荐

  1. Ubuntu16.04下安装python3.6.4详细步骤

    记录一下: Ubuntu16.04自带的python版本为python2.7和python3.5,现在想要安装python3.6.4,注意:系统自带的python版本别删除 步骤: # 官网下载安装包 ...

  2. 前端解决跨域问题的终极武器——Nginx反向代理

    提到代理,分为:正向代理和反向代理. 正向代理:就是你访问不了Google,但是国外有个VPN可以访问Google,你访问VPN后叫它访问Google,然后把数据传给你. 正向代理隐藏了真实的客户端. ...

  3. 通过itunes把文件放入app的document目录

    通过itunes把文件放入app的document目录 反向也是可以的. 仅仅需要添加plist中一项:Application supports iTunes file sharing,value Y ...

  4. Python3 面向对象之:多继承

    多继承 class ShenXian: # 神仙 def fei(self): print("神仙都会⻜") class Monkey: # 猴 def chitao(self): ...

  5. windows下安装spark-python

    首先需要安装Java 下载安装并配置Spark 从官方网站Download Apache Spark™下载相应版本的spark,因为spark是基于hadoop的,需要下载对应版本的hadoop才行, ...

  6. css hover 动画 transition:background-color 0.2s,color 0.2s; 外层套内层,正常是 里外层 鼠标上来 外层有hover,如果就想到里层hover触发外层hover,要用外层position 定义绝对定位,内层的hover跳出外层的div,这样视觉上就是两个单独的div,进行内外层联动。

    css hover 动画 transition:background-color 0.2s,color 0.2s; 外层套内层,正常是 里外层 鼠标上来 外层有hover,如果就想到里层hover触发 ...

  7. 【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素

    [练习3.11] 编写查找一个单链表特定元素的程序.分别用递归和非递归实现,并比较它们的运行时间. 链表必须达到多大才能使得使用递归的程序崩溃? Answer: 实现都是比较容易的,但是实际上查找链表 ...

  8. sql 语句系列(多表之链)[八百章之第三章]

    新增连接查询而不影响其他连接查询 请看图: 这种情况我们一般会使用左连接的方式. select e.ENAME,d.LOC,eb.RECEIVED from emp e join dept d on( ...

  9. Asp.Net Core 中IdentityServer4 实战之 Claim详解

    一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...

  10. SpringBoot集成Swagger(根据源码深入学习Swagger的用法)

    从源码层面讲解Swagger的用法,快速了解掌握Swagger 简介 Swagger 是一个规范且完整的框架,用于生成.描述.调用和可视化 Restful 风格的 Web 服务. 自动生成html文档 ...