1 form.py中写register的的form组件

from django import  forms
class Register(forms.Form): # 注册的form username = forms.CharField(
max_length=32,min_length=6,
label='姓名',
error_messages={
'required':'用户名不能为空',
'invalid':'用户名输入格式有误',
'min_length':'用户名最小长度为6位',
'max_length':'用户名最小长度为6位',
},
widget=forms.TextInput(
attrs={
'placeholder':'请输入用户名'
}
)) password= forms.CharField(
max_length=32,
min_length=6,
label='密码',
error_messages={
'required':'密码不能为空',
'invalid':'密码输入格式有误',
'min_length':'密码最短6位',
'max_lenth':'密码不能超过32位', },
widget=forms.PasswordInput(
attrs={
'placeholder':'请输入密码'
}
), ) repassword = forms.CharField(
max_length=32,
min_length=6,
label='确认密码',
error_messages={
'required': '确定密码不能为空',
'invalid': '确定密码格式错误',
'min_length': '确定密码最短6位',
'max_length': '确定密码最长32位',
},
widget=forms.widgets.PasswordInput(attrs={"placeholder": "请输入确认密码"} ), ) telephone = forms.CharField(
max_length=11,
label="手机号码",
required=False,
error_messages={
},
validators=[RegexValidator(r'^[0-9]{11}$', '请输入11位手机号码'),
RegexValidator(r'^(13|14|15|17)[0-9]{9}$', '手机号码必须以13/14/15/17开头')],
widget=forms.widgets.TextInput(attrs={"placeholder": "请输入手机号码"}),
) email = forms.EmailField(
label='邮箱',
error_messages={
'invalid': '邮箱格式错误',
},
required=False,
widget=forms.widgets.TextInput(attrs={"placeholder": "请输入邮箱"}),
) def clean_username(self):
username = self.cleaned_data.get('username')
ret = models.UserInfo.objects.filter(username=username).exists()
print(ret)
if ret:
raise ValidationError('该用户名已存在')
else:
return username def clean_repassword(self):
password = self.cleaned_data.get('password')
repassword = self.cleaned_data.get('repassword')
if password != repassword:
raise ValidationError('密码不一致')
else:
return repassword def clean_phone(self):
value = self.cleaned_data.get("phone")
if models.UserInfo.objects.filter(phone=value).exists():
raise ValidationError("该手机号码已经注册")
else:
return value def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for field in iter(self.fields): self.fields[field].widget.attrs.update({
'class': 'form-control'
})

2 写注册的视图函数

from web import form
def register(request):
"""
用户的注册
:param request:
:return:
"""
if request.method =='GET':
form_obj = form.Register()
return render(request,'register.html',{'form_obj':form_obj})
else:
form_obj = form.Register(request.POST) if form_obj.is_valid():
data = form_obj.cleaned_data
data.pop('repassword')
roles = data.pop('roles')
# roles = request.POST.getlist()
user_obj = models.UserInfo.objects.create_user(**data)
user_obj.roles.set(roles) return redirect('login')
else:
return render(request,'register.html',{'form_obj':form_obj})

3 登录函数:

from PIL import Image,ImageDraw,ImageFont
from io import BytesIO # 随机数
def get_random_color():
return (random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255)) # 验证码
def get_valid_img(request):
# 图片对象
width = 190
height = 35
img_obj = Image.new('RGB', (width, height), get_random_color())
# 画笔对象
draw_obj = ImageDraw.Draw(img_obj)
# 获取字体
font_path = os.path.join(settings.BASE_DIR, "web/static/font/font.ttf")
# 字体对象
font_obj = ImageFont.truetype(font_path, 32)
# 获取用户输入验证码的内容
sum_str = ''
for i in range(4):
a = random.choice(
[str(random.randint(0, 9)),
chr(random.randint(97, 122)),
chr(random.randint(65, 90))])
sum_str += a
# 通过画笔对象,添加文字
draw_obj.text((40, 0), sum_str, fill=get_random_color(), font=font_obj) # 添加噪线
for i in range(3):
# 两点一线
x1 = random.randint(0, width)
x2 = random.randint(0, width)
y1 = random.randint(0, height)
y2 = random.randint(0, height)
draw_obj.line((x1, y1, x2, y2), fill=get_random_color())
# 添加噪点
for i in range(3):
draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
x = random.randint(0, width)
y = random.randint(0, height)
draw_obj.arc((x, y, x + 8, y + 8), 0, random.randint(0, 360), fill=get_random_color())
# from io import BytesIO
# 操作内存的手柄
f = BytesIO()
img_obj.save(f, 'png')
data = f.getvalue() # 将验证码存在各用户自己的session中
request.session["valid_str"] = sum_str
print(sum_str)
return HttpResponse(data) def login(request):
"""
用户登录 相应的状态码:
成功:1000
验证码失败:1001
用户名密码失败:1002
:param request:
:return: """
response_msg = {'code':None,'msg':None}
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password') #得到验证码
valid_core = request.POST.get('valid_core') if valid_core.upper() == request.session.get('valid_str').upper(): #验证是否登录成功
user_obj = auth.authenticate(username=username,password=password) if user_obj:
#将用户的信息放入session中
#session注入 persission_input(request,user_obj) response_msg['code']=1000
response_msg['msg']='用户名密码正确'
else:
response_msg['code'] = 1002
response_msg['msg'] = '用户名或密码错误' else:
response_msg['code']=1001
response_msg['msg']='验证码输入错误' return JsonResponse(response_msg) def logout(request):
"""退出登录,并清除session"""
auth.logout(request)
return redirect('login')

4 register的html   register.html:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
</head>
<body> <h1>注册界面</h1>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="{% url 'register' %}" method="post" novalidate>
{% csrf_token %}
{% for foo in form_obj %}
<div class="form-group">
<label for="{{ foo.id_for_label }}" class="control-label"> {{ foo.label }}</label>
{{ foo }} <span class="text-danger"> {{ foo.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-primary pull-right" value="注册">
</form>
</div>
</div>
</div> <script src="{% static 'bootstrap-3.3.7-dist/js/jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>

5 登录的html login.html

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
</head>
<body> <h1>登录界面</h1> <div class="container-fluid">
<div class="row">
{% csrf_token %}
<div class="col-md-4 col-md-offset-4">
<div class="form-group">
<label for="username" >用户名</label>
<input type="text" name = "username" id="username" class="form-control"> </div> <div class="form-group">
<label for="password">密码</label>
<input type="password" name="password" id="password" class="form-control">
</div> <div class="form-group">
<label for="valid_core">验证码</label>
<div class="row">
<div class="col-sm-6"> <input type="text" name="valid_core" id="valid_core" class="form-control"></div> {# 得到验证码#}
<div class="col-sm-6">
<img src="{% url 'get_valid_img' %}" alt="" id="valid_core_img">
</div> </div>
</div>
<span class="error"></span> <button type="button" class="btn btn-primary pull-right login">登录</button> </div>
</div>
</div> <script src="{% static 'bootstrap-3.3.7-dist/js/jquery-3.4.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> <script>
$('.login').on('click',function () {
console.log(111)
var username = $('[name=username]').val();
var password = $('[name=password]').val();
var valid_core = $('[name=valid_core]').val();
var csrf_token = $('[name=csrfmiddlewaretoken]').val()
console.log(csrf_token) $.ajax({
url:"{% url 'login' %}",
type:'post',
data:{
username: username,
password:password,
valid_core:valid_core,
csrfmiddlewaretoken:csrf_token },
success:function (res) {
if (res.code === 1000){
var href = location.search.slice(6);
if (href){ location.href = href
}else {
location.href ='{% url 'index' %}'
} }else {
$('.error').text(res.msg)
}
} }) }) $('#valid_core_img').click(function () {
console.log($(this))
$(this)[0].src +='?'; }) </script> </body>
</html>

Django中 基于form的注册,基于ajax的登录的更多相关文章

  1. Django中的Form

    Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from dj ...

  2. Django中的form组件

    Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...

  3. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  4. 转 Django中的Form

    https://www.cnblogs.com/chenchao1990/p/5284237.html Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 ...

  5. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  6. django中的 form 表单操作

     form组件  1. 能做什么事?   1. 能生成HTML代码  input框   2. 可以校验数据   3. 保留输入的数据   4. 有错误的提示   1. 定义   from django ...

  7. django中使用Form组件

    内容: 1.Form组件介绍 2.Form组件常用字段 3.Form组件校验功能 4.Form组件内置正则校验 参考:https://www.cnblogs.com/liwenzhou/p/87478 ...

  8. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  9. Django 中的Form、ModelForm

    一.ModelForm 源码 class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): pass def modelform_fact ...

随机推荐

  1. Office 如何打印A4不干胶标签纸

    1 下载Label Expert这个软件,注意不是第一个Avery Wizard(卖家可能会送你这个软件,但是送的这款软件是简体中文版的,似乎模板不全,所以最好还是自己下,反正我最后是由于找不到对应的 ...

  2. iOS推断当前控制器是否在显示

    当点击一个cell或者button的事件,处理比較耗时,在异步线程中执行中.当子线程得到执行结果时可能不在当前控制器上了.此时我们须要取消子线程后边的事情. 此刻,当得到结果时须要推断是否在当前控制器 ...

  3. Objective-C NSFileManager 文件管理总结

    createFileAtPath //创建文件 NSFileManager *fm = [NSFileManager defaultManager]; NSString *strpath = [NSS ...

  4. coffeescript的上下文

    CoffeeScript代码中,变量,甚至函数前面有时会带上一个@符号,那么翻译到 javascript里,就是 "this." 这就涉及到运行过程中的上下文. 这个this指什么 ...

  5. 如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile

    1 2 3 4 5 6 7 8 9 //根据configure.in和Makefile.am生成makefile的步骤,基于UBUNTU 12.04 1.autoscan (可选) 2.aclocal ...

  6. astgo 老版本免激活完整安装包带安装命令脚本

    astgo是个国产的老牌经典软交换服务器,主要用来当回拨网络电话服务端,同时也具备群呼.传真等功能! 这个需要安装在centos 5.x 32位系统.带安装脚本,上传到root目录后执行安装脚本即可等 ...

  7. 必会!Linux文件的管理

    1.1 创建一个目录 /data [root@liuhao ~]# mkdir /data 1.2 查看目录是否创建成功 <可以找到data即为创建成功> [root@liuhao ~]# ...

  8. E20171006-hm

    trace  vt. 跟踪,追踪; 追溯,探索; 探索; 查找;          vi. 沿着一小径或道路前进; 可以追溯的;            n. 痕迹; 痕迹,踪迹; 微量,极少量; [植 ...

  9. [Swift通天遁地]二、表格表单-(9)快速创建一个美观强大的表单

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. Akka源码分析-Extension

    一个设计优秀的工具或框架,应该都有一个易用.强大的插件或扩展体系,akka也不例外. akka的扩展方法非常简单,因为只涉及到两个组件:Extension. ExtensionId.其中Extensi ...