1.前端的ajax代码不用改动

2.modelform,在原来基础上稍作改动

from django import forms
from app01.models import UserInfo
from django.forms import widgets as wid
from django.core.exceptions import ValidationError
import re class UserModelForm(forms.ModelForm):
r_password = forms.CharField(min_length=5, label="确认密码", widget=wid.PasswordInput(),
error_messages={
"required": "确认密码不能为空!",
"min_length": "确认密码不能少于5位!"
}
)
class Meta:
model=UserInfo
fields=["username","password","r_password","email"]
labels={
"username":"用户名",
"password":"密码",
"email":"邮箱"
}
error_messages={
"username":{"required":"用户名不能为空!",
"min_length":"用户名不能少于5位!"},
"password":{"required":"密码不能为空!",
"min_length": "密码不能少于5位!"},
"email":{"required":"邮箱不能为空!",
"invalid":"邮箱格式错误!"}
}
widgets={"password":wid.PasswordInput()} def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for field in self.fields.values():
field.widget.attrs.update({"class":"form-control"}) def clean_username(self):
val = self.cleaned_data.get("username")
user_obj = UserInfo.objects.filter(username=val).first()
if user_obj:
raise ValidationError("该用户已经存在!")
else:
return val def clean_password(self):
val = self.cleaned_data.get("password")
if val.isdigit():
raise ValidationError("密码不能是纯数字!")
else:
return val def clean_email(self):
val = self.cleaned_data.get("email")
ret = re.search("\w+@163.com$",val)
if ret:
return val
else:
raise ValidationError("邮箱必须是163邮箱!") def clean(self):
password = self.cleaned_data.get("password")
r_password = self.cleaned_data.get("r_password")
if password and r_password and password != r_password:
self.add_error("r_password",ValidationError("两次密码输入不一致!"))
else:
return self.cleaned_data

3.视图函数,稍微一改

def reg(request):
# 注册功能
if request.method == "POST":
ret = json.loads(request.body)
form = UserModelForm(ret)
res = {"status":200,"err_msg":""}
if form.is_valid():
form.save()
# del ret["r_password"]
# UserInfo.objects.create_user(**ret)
else:
res["status"] = 201
res["err_msg"] = form.errors
return JsonResponse(res)
else:
form = UserModelForm()
return render(request,"reg.html",{"form":form})

modelform的使用

(1)  model的知识点:
class UserInfo(AbstractUser):
tel=models.CharField(max_length=32)
gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1) yuan=UserInfo.objects.get(pk=1)
yuan.get_gender_display() (2) modelform使用
model.py:
class Book(models.Model):
nid=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
pub_date=models.DateTimeField() # "2012-12-12" # comment_count=models.IntegerField(default=100)
# poll_count=models.IntegerField(default=100) publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE) # 级联删除
authors=models.ManyToManyField(to="Author")
def __str__(self):
return self.title
form.py:
# 构建modelform
class BookModelForm(forms.ModelForm):
class Meta:
model=Book
fields="__all__" '''
BookModelForm等同于:
class BookForm(forms.Form):
title=forms.CharField(max_length=32)
price=forms.IntegerField()
pub_date=forms.DateField(widget=widgets.TextInput(attrs={"type":"date"}))
#publish=forms.ChoiceField(choices=[(1,"AAA"),(2,"BBB")])
publish=forms.ModelChoiceField(queryset=Publish.objects.all())
authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all()) ''' 逻辑:
添加书籍:
def add(reqeust):
if GET请求:
form=BookModelForm()
return render(reqeust,{"form":form})
'''
渲染页面
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" value="提交" class="btn btn-default pull-right">
</form>
'''
else POST请求:
form=BookModelForm(request.POST)
if form.is_valid():
form.save() # Book.objects.create(clean_data)
return redirect("/")
else:
return render(reqeust,{"form":form}) 编辑书籍: def edit(request,id):
edit_obj=Book.objects.get(pk=id)
if GET请求:
form=BookModelForm(instance=edit_obj)
return render(reqeust,{"form":form})
'''
渲染页面同添加页面 '''
else POST请求:
form=BookModelForm(request.POST,instance=edit_obj)
if form.is_valid():
form.save() # edit_obj.update(clean_data)
return redirect("/")
else:
return render(reqeust,{"form":form})

ModelForm的简单使用-注册用modelform编写的更多相关文章

  1. 基于modelform和ajax的注册

    forms文件 创建ModelForm组件 from django import forms from crm import models from django.core.exceptions im ...

  2. ModelForm理解简单运用(增删改查)

    from django.shortcuts import render, redirect,HttpResponse# Create your views here.from django.forms ...

  3. JSP中request对象的简单实用,实现简单的注册以及个人信息的展示

    JSP中Request对象的使用 概述:request对象主要用于接收客户端发送来的请求信息,客户端的请求信息被封装在request对象中,通过它可以了解到客户的需求,然后做出响应.主要封装了用户提交 ...

  4. AJAX实现简单的注册页面异步请求

    p { margin: 0px; padding: 0px } AJAX简介 (1)AJAX = 异步 JavaScript 和 XML. (2)AJAX 是一种用于创建快速动态网页的技术. (3)通 ...

  5. Node.js基于Express框架搭建一个简单的注册登录Web功能

    这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...

  6. 简单登录注册实现(Java面向对象复习)

    简单登录注册的实现(面向对象的复习) 需求: 设计用户类,包含用户名和密码两个属性 设计LoginDemo类设计用户登录方法 用户有三次登录机会,如果连续三次登录失败则退出程序 功能实现页面:     ...

  7. C#实现软件授权,限定MAC运行(软件license管理,简单软件注册机制)

    一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理. 基本原理:1.软件一运 ...

  8. Android笔记-4-实现登陆页面并跳转和简单的注册页面

    实现登陆页面并跳转和简单的注册页面   首先我们来看看布局的xml代码 login.xml <span style="font-family:Arial;font-size:18px; ...

  9. C#软件license管理(简单软件注册机制)

    最近做了一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理.        ...

随机推荐

  1. PHPExcel 中文使用手册参数详解 三

    设置excel的属性:创建人$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");最后修改人$ob ...

  2. windwos 安装 vue-cli

    安装vue-cli 安装之前我们需要先安装node.js以及包管理工具npm,有兴趣的可以安装nvm版本管理工具 地址:https://www.cnblogs.com/lph970417/p/1184 ...

  3. jquery向上滚动页面的写法

    jquery向上滚动页面的写法<pre> $('.arrow_top').on('click',function () { $body = (window.opera) ? (docume ...

  4. 【转】Fuel-openstack的搭建(二)

    原文链接:https://blog.csdn.net/qq_35180983/article/details/82181525 部署Openstack 3.1 登陆 登陆http://10.20.0. ...

  5. Spring中的常用注解

    Spring中的常用注解 1.@Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.

  6. Kafka Schema Registry | 学习Avro Schema

    1.目标 在这个Kafka Schema Registry教程中,我们将了解Schema Registry是什么以及为什么我们应该将它与Apache Kafka一起使用.此外,我们将看到Avro架构演 ...

  7. 2.RabbitMQ 的可靠性消息的发送

      本篇包含 1. RabbitMQ 的可靠性消息的发送 2. RabbitMQ 集群的原理与高可用架构的搭建 3. RabbitMQ 的实践经验   上篇包含 1.MQ 的本质,MQ 的作用 2.R ...

  8. 【C#】上机实验三

    实验1: 定义一个 TimePeiod 类 包含: hour , minute , second 实现时间的在 时分秒上的加法. using System; using System.Collecti ...

  9. [洛谷P5323][BJOI2019]光线

    题目大意:有$n$层玻璃,每层玻璃会让$a\%$的光通过,并把$b\%$的光反射.有一束光从左向右射过,问多少的光可以透过这$n$层玻璃 题解:事实上会发现,可以把连续的几层玻璃合成一层玻璃,但是要注 ...

  10. 同一个Tomcat部署多个springboot项目问题

    2018-12-13 10:37:21,412 ERROR [localhost-startStop-2] c.a.d.s.DruidDataSourceStatManager [DruidDataS ...