forms文件

创建ModelForm组件

from django import forms
from crm import models
from django.core.exceptions import ValidationError
import hashlib #注册form
class RegForm(forms.ModelForm):
#添加确认密码 按照form组件的样式写
password = forms.CharField(widget=forms.PasswordInput(),required="不能为空",label="密码22",min_length="")
re_password = forms.CharField(widget=forms.PasswordInput(),label="确认密码",min_length="") class Meta:
#指定关联的model
model=models.UserProfile #要展示的内容
# fields="__all__" #展示所有的字段
# exclude=["is_active"] #排除这个字段 #或者指定要显示的字段 决定了在页面上的显示顺序 *** 即使是自定义的re_password也可以写进来
fields=["username","name","password","re_password","department","mobile"] #这个label的注释直接在modelform中改 或者 在model中写verbose_name="用户名"
#这设置的label只对models里的字段起作用, 自己定义的re_password 不起作用
labels={ #全局设置, 没有加label的字段就还是按数据库里的字段名
"username":"用户名",
"password":"密码",
"name":"姓名",
"department":"部门",
} widgets = {
# "password":forms.PasswordInput(attrs={"class":"form-control"}) #密码显示密文
} # 单加的报错 只对title做设置
error_messages = {
"username":{"required":"不能为空","invalid":"格式错误"},
"department":{"required":"不能为空"},
"mobile":{"required":"不能为空"},
} ##初始化把样式调出来
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
#调节样式
print(self.fields) #拿到的是对象
for field in self.fields.values(): #field 是取出来的对象
field.error_messages={"required":"不能为空"}#批量处理
field.widget.attrs.update({"class":"form-control"}) def clean(self): #两次密码校验
pwd = self.cleaned_data.get("password")
re_pwd = self.cleaned_data.get("re_password")
print(self.cleaned_data)
if pwd == re_pwd and pwd: #如果密码和确认密码一致, 并且存在
# 两次密码一致 之后对密码进行加密
md5 = hashlib.md5() # MD5对象
md5.update(pwd.encode("utf-8")) #加密结果
pwd = md5.hexdigest()
print(pwd) #3c4423d6a2f6dfcac2ad6f6d1981ad35
self.cleaned_data["password"] = pwd
print("-->",self.cleaned_data)
#{'username': 'sanjiang@qq.com', 'name': 'sanjiang', 'password': '3c4423d6a2f6dfcac2ad6f6d1981ad35', 're_password': 'sanjiang', 'department': <Department: 销售部>, 'mobile': None}
return self.cleaned_data
else:
self.add_error("re_password","两次密码不一致") #把错误提示加到re_password 容易取值
raise ValidationError("两次密码不一致") #错误提示加到了所有的错误里了不容易取值

在views文件中利用modelform实例化

from django.shortcuts import render,HttpResponse,redirect
from crm.models import UserProfile
from crm.forms import RegForm
from django.http import JsonResponse #注册 用ModelForm 和ajax
def reg(request):
form_obj = RegForm() if request.method=="POST":
form_obj = RegForm(request.POST) #用RegForm做校验 res = {"user":None,"err_msg":""}
if form_obj.is_valid(): #通过校验
print('通过校验')
print(form_obj.cleaned_data)
#{'username': 'sanjiang@qq.com', 'name': 'sanjiang', 'password': '3c4423d6a2f6dfcac2ad6f6d1981ad35', 're_password': 'sanjiang', 'department': <Department: 销售部>, 'mobile': None} res["user"] = form_obj.cleaned_data.get("username") # 写入数据到数据库
form_obj.cleaned_data.pop("re_password") #把re_password删除 因为没有在models的字段里
# print(form_obj.cleaned_data)
obj = UserProfile.objects.create(**form_obj.cleaned_data)
# print(obj) else:
# print("错误信息:",form_obj.errors)
# print("部分干净信息:",form_obj.cleaned_data)
res["err_msg"] = form_obj.errors
return JsonResponse(res) return render(request,"reg.html",{"form_obj":form_obj})

注册的html

{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<div class="container">
<div class="row" style="margin-top: 70px">
<div class="col-sm-6 col-sm-offset-3">
<form class="form-horizontal" method="post" action="" novalidate>
{# {{ form_obj.as_p }}#}
{% csrf_token %} {# <div class="form-group">#}
{# <label for="{{ form_obj.username.id_for_label }}"#}
{# class="col-sm-2 control-label">{{ form_obj.username.label }}</label>#}
{# {{ form_obj.username.id_for_label }} 作用就是点击对应的label"用户名" 光标会自动聚焦在这个数入框 #}
{# {{ form_obj.username.label }} 作用 显示对应的中文名称 #}
{# <div class="col-sm-10">#}
{# {{ form_obj.username }}#}
{# {{ form_obj.username }} 生成一个username的input输入框 #}
{# {{ form_obj.username.errors.0 }}#}
{# 错误提示#}
{# </div>#}
{# </div>#}
{##}
{# <div class="form-group">#}
{# <label for="{{ form_obj.password.id_for_label }}"#}
{# class="col-sm-2 control-label">{{ form_obj.password.label }}</label>#}
{# <div class="col-sm-10">#}
{# {{ form_obj.password }}#}
{# {{ form_obj.password.errors.0 }}#}
{# </div>#}
{# </div>#}
{##}
{# <div class="form-group">#}
{# <label for="{{ form_obj.name.id_for_label }}"#}
{# class="col-sm-2 control-label">{{ form_obj.name.label }}</label>#}
{# <div class="col-sm-10">#}
{# {{ form_obj.name }}#}
{# {{ form_obj.name.errors.0 }}#}
{# </div>#}
{# </div>#}
{##}
{# <div class="form-group">#}
{# <label for="{{ form_obj.department.id_for_label }}"#}
{# class="col-sm-2 control-label">{{ form_obj.department.label }}</label>#}
{# <div class="col-sm-10">#}
{# {{ form_obj.department }}#}
{# {{ form_obj.department.errors.0 }}#}
{# </div>#}
{# </div>#} {# igcrm 中写的 循环取值展示#}
{% for field in form_obj %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{{ field }}
<span class="error pull-right">{{ field.errors.0 }}</span>
{# 显示错误信息#}
</div>
{% endfor %} {# 额外添加的确认密码 #}
{# <div class="form-group">#}
{# <label for="{{ form_obj.re_password.id_for_label }}"#}
{# class="col-sm-2 control-label">{{ form_obj.re_password.label }}</label>#}
{# <div class="col-sm-10">#}
{# {{ form_obj.re_password }}#}
{# {{ form_obj.re_password.errors.0 }}#}
{# </div>#}
{# </div>#} {# <div class="form-group">#}
{# <div class="col-sm-offset-2 col-sm-10">#}
{# <button type="submit" class="btn btn-default">Sign in</button>#}
{# </div>#}
{# </div>#} {# <input type="submit" class="btn btn-primary pull-left" id="reg_btn" value="注册">#} 发送ajax请求的时候就不能再使用submit类型了
<input type="button" class="btn btn-primary pull-left" id="reg_btn" value="注册">
</form>
</div>
</div>
</div> <script src="/static/js/jquery.js"></script>
<script>
$("#reg_btn").click(function(){
{#alert("绑定成功");#}
$.ajax({
url:"",
type:"post",
data:{
username:$("#id_username").val(),
name:$("#id_name").val(),
password:$("#id_password").val(),
re_password:$("#id_re_password").val(),
department:$("#id_department").val(),
mobile:$("#id_mobile").val(),
csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
},
success:function(res){ console.log('');
{#console.log(res);#}
if(res.user){
//注册成功
alert("注册成功");
location.href="/login/"
}else{
//清除错误
console.log('aaaa')
$(".error").html("");
$(".form-group").removeClass("has-error"); //展示新错误
$.each(res.err_msg,function(i,j){
console.log(i,j);
$("#id_"+i).next().html(j[0]).css("color","red").parent().addClass("has-error")
})
}
},
}) }) </script>
</body>
</html>

基于modelform和ajax的注册的更多相关文章

  1. 2.1博客系统 |基于form组件和Ajax实现注册登录

    基于forms组件和Ajax实现注册功能 1 基于forms组件设计注册页面 --点击头像 === 点击input --头像预览: 修改用户选中的文件对象:获取文件对象的路径:修改img的src属性, ...

  2. 3- 功能2:基于forms组件和ajax实现注册功能

    1.forms组件的注册页面 url from django.urls import path, re_path from blog import views from django.views.st ...

  3. 基于forms组件和Ajax实现注册功能

    一.基于forms组件的注册页面设计 1.运用forms组件的校验字段功能实现用户注册 views.py:    (在钩子中代码解耦,将form放在cnblog/blog/Myforms.py中) f ...

  4. 基于 Django的Ajax实现 文件上传

    ---------------------------------------------------------------遇到困难的时候,勇敢一点,找同学朋友帮忙,找导师求助. Ajax Ajax ...

  5. BBS-基于forms组件和ajax实现注册功能

    http://www.cnblogs.com/yuanchenqi/articles/7638956.html 1.设计注册页面 views.py from django import forms c ...

  6. [实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册

    写在前面 今天贴合到实际的客户需求仔细的想了下,其实在userInfo这个类里面很多字段都不是必须的.有很多的事业单位根本就不能上网,填写的邮箱也是exchange的,个人的详细信息都在ad里面可以取 ...

  7. 基于JS的ajax的实现,JSON和JSONP,基于JQuery的ajax的实现

    基于JS的ajax的实现,JSON和JSONP,基于JQuery的ajax的实现1.基于JS的ajax的实现 step1: var xmlhttp = XMLHttprequest() #实例化一个对 ...

  8. 基于jQuery的ajax对WebApi和OData的封装

    基于jQuery的ajax对WebApi和OData的封装 WebApi 的使用带来了一个显著的特点,对type有一定的要求.一般ajax的type无非就是两种,GET和POST.如果用JSONP来跨 ...

  9. 源码来袭!!!基于jquery的ajax分页插件(demo+源码)

    前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...

随机推荐

  1. 所有语言的Awesome(2)

    Curated list of awesome lists https://awesomeweekly.co https://github.com/sindresorhus/awesome ✨ Pre ...

  2. Plupload上传实例《模仿微云上传实例》,带源码

    Plupload上传实例<模仿微云上传实例>,带源码,作者:鱼塘总裁 如有疑问,加群交流:646104701 一.实例截图 1.上传过程 2.上传成功 3.上传失败 4.最小化 二.所需文 ...

  3. 向github提交本地项目

    首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: https://gi ...

  4. Attention is all you need及其在TTS中的应用Close to Human Quality TTS with Transformer和BERT

    论文地址:Attention is you need 序列编码 深度学习做NLP的方法,基本都是先将句子分词,然后每个词转化为对应的的词向量序列,每个句子都对应的是一个矩阵\(X=(x_1,x_2,. ...

  5. Linux下的帮助命令

    内建命令,外部命令,命令别名:使用:type 命令名,查看 内建命令是shell一部分,一开始就加载进内存,程序一般简单:外部命令反之 2.  帮助命令的使用 内建命令:help 命令名:外部命令:命 ...

  6. linux+php+swoole解决方案

    服务器接收巨量的并发我使用linux+php+swoole解决方案.简单快速高效 并发量大 稳定 http://www.swoole.com/

  7. 初探 C# 8 的 Nullable Reference Types

    溫馨提醒:本文提及的 C# 8 新功能雖已通過提案,但不代表將來 C# 8 正式發布時一定會納入.這表示我這篇筆記有可能白寫了,也表示您不必急著瞭解這項新功能的所有細節,可能只要瞄一下底下的「概要」說 ...

  8. Qt - 设置程序界面风格(现成的QMacStyle等等)

    类的继承关系: QMotifStyle:OSF(开放基金协会)开发的一个工业标准的GUI(图形用户接口): QCDEStyle:公共桌面环境(Common Desktop Environment)的缩 ...

  9. notepadd++正则表达式大小写转换

    示例1:将语句 test this sentence 转为大写 查找:^.*$ 替换:\U$0 或------------ 查找:^(.*)$ 替换:\U\1 或 \U$1 示例2:将语句 TEST ...

  10. bootstrap组件和插件

    一.用node.js读取文件 //引入fs模块 var fs= require ('fs'); // console.log(fs); //调用fs模块的readFile方法 fs.readFile( ...