一、Form

form.py

from django import forms
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
import re # 定义手机号验证规则
def phone_validate(value):
phone = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
if not phone.match(value):
raise ValidationError("手机号格式错误") class RegForm(forms.Form):
username = forms.CharField(
label="用户名",
min_length=6,
initial="请输入用户名",
error_messages={
'required': "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短6位"
},
widget=forms.widgets.TextInput(attrs={"class": "form-control"})
) password = forms.CharField(
label="密码",
min_length=8,
widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
error_messages={
"required": "不能为空",
"min_length": "不能少于8位"
}
) re_password = forms.CharField(
label="密码",
min_length=8,
widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
error_messages={
"required": "不能为空",
"min_length": "不能少于8位"
}
) email = forms.EmailField(
label="邮箱",
widget=forms.widgets.TextInput(attrs={"class": "form-control"}),
error_messages={
'required': "不能为空",
"invalid": "格式错误",
}
) # radio
gender = forms.fields.ChoiceField(
choices=((1,"男"),(0,"女"),),
label="性别",
initial=1,
widget=forms.widgets.RadioSelect()
) # 单选select
se_hobby = forms.fields.ChoiceField(
label="select单选爱好",
choices=((1,"篮球"),(2,"网球"),(3,"羽毛球"),),
# initial=1,
widget=forms.widgets.Select()
) # 多选select
se_hobbys = forms.fields.MultipleChoiceField(
label="select多选爱好",
choices=((1, "篮球"), (2, "网球"), (3, "羽毛球"),),
initial=[1,],
widget=forms.widgets.SelectMultiple()
) # 单选checkbox
keep_username = forms.fields.ChoiceField(
label="记住用户名",
# initial="checked",
widget=forms.widgets.CheckboxInput()
) # 多选checkbox
ch_hobbys = forms.fields.MultipleChoiceField(
label="checkbox多选爱好",
choices=((1, "篮球"), (2, "网球"), (3, "羽毛球"),),
# initial=[1, 2],
widget=forms.widgets.CheckboxSelectMultiple()
) # 手机号
phone = forms.fields.CharField(
validators=[phone_validate, ],
error_messages={
"required": "手机不能为空"
},
widget=forms.widgets.TextInput(attrs={"class": "form-control"})
) # # 批量增加样式
# def __init__(self, *args, **kwargs):
# super(RegForm, self).__init__(*args, **kwargs)
# for field in iter(self.fields):
# self.fields[field].widget.attrs.update({
# 'class': 'form-control'
# })
#
# # 动态获取数据库的choice数据
# self.fields["gender"].choices = User.objects.all().values_list("id", "gender") # 重写全局的钩子函数,对确认密码做校验
def clean(self):
password = self.cleaned_data.get("password")
re_password = self.cleaned_data.get("re_password")
if re_password and re_password != password:
self.add_error("re_password", ValidationError("两次输入的密码不一致"))
else:
return self.cleaned_data # 定义局部钩子,验证用户名是否被注册
def clean_username(self):
username = self.cleaned_data.get("username")
is_exist = User.objects.filter(username=username)
if is_exist:
self.add_error("username", ValidationError("用户名已被注册"))
else:
return username # 定义局部钩子,验证邮箱是否可用
def clean_email(self):
email = self.cleaned_data.get("email")
is_exist = User.objects.filter(email=email)
if is_exist:
self.add_error("email", ValidationError("邮箱不可用"))
else:
return email

view.py

def reg(request):
form_obj = RegForm()
if request.method == "POST":
ret = {"status": 0, "msg": ""}
form_obj = RegForm(request.POST)
if form_obj.is_valid():
# form_obj.cleaned_data.pop("re_password")
# print(form_obj.cleaned_data)
# User.objects.create_user(**form_obj.cleaned_data)
ret["msg"] = "/login"
return JsonResponse(ret)
else:
# print(form_obj.errors)
ret["status"] = 1
ret["msg"] = form_obj.errors
return JsonResponse(ret)
return render(request, 'register.html', {"forms_obj": form_obj})

register.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta http-equiv='Content-type' content='text/htm'>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3 reg-form">
<h3 class="text-center">Register</h3><br>
<form class="form-horizontal" novalidate method="post"
enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group ">
<label for='{{ forms_obj.username.id_for_label }}'
class="col-sm-2 control-label">{{ forms_obj.username.label }}</label>
<div class="col-sm-8">
{{ forms_obj.username }}
<span class="help-block">{{ forms_obj.username.errors.0 }}</span>
<span id="ss" class="help-block"></span>
</div>
</div> <div class="form-group ">
<label for='{{ forms_obj.password.id_for_label }}'
class="col-sm-2 control-label">{{ forms_obj.password.label }}</label>
<div class="col-sm-8">
{{ forms_obj.password }}
<span class="help-block">{{ forms_obj.password.errors.0 }}</span>
</div>
</div> <div class="form-group ">
<label for='{{ forms_obj.re_password.id_for_label }}'
class="col-sm-2 control-label">{{ forms_obj.re_password.label }}</label>
<div class="col-sm-8">
{{ forms_obj.re_password }}
<span class="help-block">{{ forms_obj.re_password.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.email.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.email.label }}</label>
<div class="col-sm-8">
{{ forms_obj.email }}
<span class="help-block">{{ forms_obj.email.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.gender.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.gender.label }}</label>
<div class="col-sm-8">
{{ forms_obj.gender }}
<span class="help-block">{{ forms_obj.gender.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.se_hobby.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.se_hobby.label }}</label>
<div class="col-sm-8">
{{ forms_obj.se_hobby }}
<span class="help-block">{{ forms_obj.se_hobby.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.se_hobbys.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.se_hobbys.label }}</label>
<div class="col-sm-8">
{{ forms_obj.se_hobbys }}
<span class="help-block">{{ forms_obj.se_hobbys.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.keep_username.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.keep_username.label }}</label>
<div class="col-sm-8">
{{ forms_obj.keep_username }}
<span class="help-block">{{ forms_obj.keep_username.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.ch_hobbys.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.ch_hobbys.label }}</label>
<div class="col-sm-8">
{{ forms_obj.ch_hobbys }}
<span class="help-block">{{ forms_obj.ch_hobbys.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.phone.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.phone.label }}</label>
<div class="col-sm-8">
{{ forms_obj.phone }}
<span class="help-block">{{ forms_obj.phone.errors.0 }}</span>
</div>
</div> <div class="form-group">
<div class="col-sm-offset-3 col-sm-6">
<button id="reg_submit" type="button" class="btn btn-success btn-block">注册</button>
</div>
</div>
</form>
</div>
</div>
</div> <script>
$("#reg_submit").click(function () {
var formData = new FormData();
formData.append("username", $("#id_username").val());
formData.append("password", $("#id_password").val());
formData.append("re_password", $("#id_re_password").val());
formData.append("gender", $("input[name='gender']:checked").val());
formData.append("se_hobby", $("#id_se_hobby").val());
formData.append("se_hobbys", $("#id_se_hobbys").val());
formData.append("keep_username", $("#id_keep_username").prop("checked"));
formData.append("ch_hobbys", $("#id_ch_hobbys input[name='ch_hobbys']:checked").val());
formData.append("phone", $("#id_phone").val());
formData.append("csrfmiddlewaretoken", $("input[name='csrfmiddlewaretoken']").val());
$.ajax({
url:'/register/',
type:'post',
processData: false,
contentType: false,
data:formData,
}).done(function (data) {
if (data.status){
$.each(data.msg,function (k,v) {
$("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error")
})
}
else {
window.location.href = data.msg
}
})
}); $("form input").focus(function () {
$(this).next("span").text("").parent().parent().removeClass("has-error");
});
$("form select").focus(function () {
$(this).next("span").text("").parent().parent().removeClass("has-error");
});
$("form input[name='ch_hobbys']").focus(function () {
$(this).parents("ul").next("span").text("").parent().parent().removeClass("has-error");
})
</script>
</body>
</html>

二、ModelForm

form.py

from booktest.models import *
from django.forms import widgets as wds class BookForm(forms.ModelForm):
class Meta:
model = BookInfo
fields = "__all__"
labels = {
"btitle": "书名",
"bpub_date": "发布日期",
"bcomment": "评论量",
"bread": "阅读量"
} widgets = {
"btitle": wds.TextInput(attrs={"class": "form-control"}),
"bpub_date": wds.TextInput(attrs={"class": "form-control", "type": "date"}),
"bread": wds.TextInput(attrs={"class": "form-control"}),
"bcomment": wds.TextInput(attrs={"class": "form-control"})
} error_messages = {
"btitle": {"required":"不能为空",},
"bpub_date": {"required":"不能为空",},
"bcomment": {"required":"不能为空",},
"bread": {"required":"不能为空",}
}

view.py(add_book)

def add_book(request):
form_obj = BookForm()
if request.method == "POST":
ret = {"status": 0, "msg": ""}
form_obj = BookForm(data=request.POST)
if form_obj.is_valid():
print(form_obj.cleaned_data)
form_obj.save()
ret["msg"] = '/bookform'
return JsonResponse(ret)
else:
ret["status"] = 1
ret["msg"] = form_obj.errors
return JsonResponse(ret)
return render(request, 'add_book.html', {"forms_obj": form_obj})

add_book.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta http-equiv='Content-type' content='text/htm'>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3 reg-form">
<h3 class="text-center"></h3><br>
<form class="form-horizontal" novalidate method="post"
enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group ">
<label for='{{ forms_obj.btitle.id_for_label }}'
class="col-sm-2 control-label">{{ forms_obj.btitle.label }}</label>
<div class="col-sm-8">
{{ forms_obj.btitle }}
<span class="help-block">{{ forms_obj.btitle.errors.0 }}</span>
<span id="ss" class="help-block"></span>
</div>
</div> <div class="form-group ">
<label for='{{ forms_obj.bpub_date.id_for_label }}'
class="col-sm-2 control-label">{{ forms_obj.bpub_date.label }}</label>
<div class="col-sm-8">
{{ forms_obj.bpub_date }}
<span class="help-block">{{ forms_obj.bpub_date.errors.0 }}</span>
</div>
</div> <div class="form-group ">
<label for='{{ forms_obj.bcomment.id_for_label }}'
class="col-sm-2 control-label">{{ forms_obj.bcomment.label }}</label>
<div class="col-sm-8">
{{ forms_obj.bcomment }}
<span class="help-block">{{ forms_obj.bcomment.errors.0 }}</span>
</div>
</div> <div class="form-group">
<label for="{{ forms_obj.bread.id_for_label }}"
class="col-sm-2 control-label">{{ forms_obj.bread.label }}</label>
<div class="col-sm-8">
{{ forms_obj.bread }}
<span class="help-block">{{ forms_obj.bread.errors.0 }}</span>
</div>
</div> <div class="form-group">
<div class="col-sm-offset-3 col-sm-6">
<button id="reg_submit" type="button" class="btn btn-success btn-block">注册</button>
</div>
</div>
</form>
</div>
</div>
</div> <script>
$("#reg_submit").click(function () {
var formData = new FormData();
formData.append("btitle", $("#id_btitle").val());
formData.append("bpub_date", $("#id_bpub_date").val());
formData.append("bcomment", $("#id_bcomment").val());
formData.append("bread", $("#id_bread").val());
formData.append("csrfmiddlewaretoken", $("input[name='csrfmiddlewaretoken']").val());
$.ajax({
url:'/bookform/',
type:'post',
processData: false,
contentType: false,
data:formData,
}).done(function (data) {
if (data.status){
$.each(data.msg,function (k,v) {
$("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error")
})
}
else {
window.location.href = data.msg
}
})
}); $("form input").focus(function () {
$(this).next("span").text("").parent().parent().removeClass("has-error");
});
</script>
</body>
</html>

view.py(edit_book)

def editbook(request, book_id):
edit_book = BookInfo.objects.get(id=book_id)
if request.method == "POST":
form_obj = BookForm(request.POST, instance=edit_book)
if form_obj.is_valid():
form_obj.save() # edit_book.update(request.POST)
return redirect('/add_book')
else:
form_obj = BookForm(instance=edit_book)
return render(request, 'edit_book.html', locals())

edit_book.html

<body>
<form method="post">
{% csrf_token %}
{% for field in form_obj %}
<div>
{{ field.label }}
{{ field }}<span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit">
</form> </body>

Django—Form、ModelForm的更多相关文章

  1. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  2. Django之Model、Form、ModelForm区别

    本节内容: 1:Model               https://www.cnblogs.com/shuai1991/p/10844662.html 2:Form                 ...

  3. Model、Form、ModelForm的比较

    Model.Form.ModelForm 本节内容: 1:Model 2:Form 3:Model Form 1 2 3 http://www.cnblogs.com/wupeiqi/articles ...

  4. Django 中的Form、ModelForm

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

  5. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  6. Django Form and Modelform Admin定义 高级查询)

    Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...

  7. Django Form和ModelForm组件

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

  8. Django - Form和ModelForm

    [TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...

  9. Django Form and ModelForm

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

随机推荐

  1. Vue-详解设置路由导航的两种方法

    https://www.cnblogs.com/superlizhao/p/8527317.html

  2. 【linux】Python3.6安装报错 configure: error: no acceptable C compiler found in $PATH

    安装python的时候出现如下的错误: [root@master ~]#./configure --prefix=/usr/local/python3.6 checking build system ...

  3. aop 幂等验证(二)

    1 创建IIdempotent @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNT ...

  4. Xilinx FPGA引脚txt文件导入excel中

    需求 为了把xilinx FPGA的官方引脚文件txt转成excel文件(实际官网中有对应的csv文件就是excel文件了...) xilinx FPGA引脚地址:https://china.xili ...

  5. htaccess 的使用基本小节 For apache httpd

    htaccess 的使用基本小节 For apache httpd .htaccess的基本作用 .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令.       .ht ...

  6. Floyed-Warshall【弗洛伊德算法】

    首先介绍一下有关最短路径的知识 从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算 ...

  7. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)

    传送门 题意: 给你一个包含 n 个元素的序列 a[]: 定义序列 a[] 的 beauty 为序列 a[] 的连续区间的加和最大值,如果全为负数,则 beauty = 0: 例如: a[] = {1 ...

  8. 使Python走向Effective系列目录

    Effective以一词,并不单单局限于执行速度层面的高效率,同时有着令代码易于阅读.易于测试且易于维护等意思,此外,它还蕴藏着易于扩展.易于修改和易于多人协作等更为高阶的理念.如果能够通过一些具体的 ...

  9. 05--STL序列容器(List)

    一:List双向链表简介 list是一个双向链表容器,可高效地进行插入删除元素. list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符.It++(ok) it+5(err)list不 ...

  10. js javascript 简易随机值穿插加解密【原】

    适用场景 本方法适用于需要对敏感信息进行加密传输,但加解密要求又不高的场景,因为是前台的javascript加解密,所以其实还是能通过js代码分析出原始值来的. 如果您对信息极其敏感, 比例登录密码这 ...