一、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. IOS 选择会员资格

    选择会员资格 针对所有 Apple 平台进行开发从未如此简单.要开始为 macOS.iOS.tvOS 和 watchOS 开发 app,请从 Mac App Store 下载 Xcode.如果您已准备 ...

  2. 关于TVWALL 通过AS300获取状态连接失败

    昨天晚会突然之间频繁出现tvwall视频软件,断开AS300管理软件的故障 发现AS300当中的cms服务进程,占用内存250M左右,一般情况下估计就是50M左右,增长了不少 无奈之下,只有重启AS3 ...

  3. 【WC2019】数树 树形DP 多项式exp

    题目大意 有两棵 \(n\) 个点的树 \(T_1\) 和 \(T_2\). 你要给每个点一个权值吗,要求每个点的权值为 \([1,y]\) 内的整数. 对于一条同时出现在两棵树上的边,这条边的两个端 ...

  4. emwin之在中断服务程序中创建窗口的结果

    @2019-04-28 [小记] 使用emwin设计器生成的程序,将该窗口创建放在中断服务程序中出现奇怪现象,非死机但功能间歇性异常,将创建窗口程序放于普通程序中则工作正常

  5. React踩坑记

    一: Support for the experimental syntax 'classProperties' isn't currently enabled ERROR in ./src/inde ...

  6. Linux之vi编辑器

    vi编辑器是Linux系统下标准的编辑器.而且不逊色于其他任何最新的编辑器.可是会用的有多少呢.下面介绍一下vi编辑器的简单用法和部分命令.让你在Linux系统中畅行无阻. 基本上vi可以分为三种状态 ...

  7. Exp3 免杀原理与实践

    一.实验过程 1.编码器 (1)使用msf编码器,直接生成meterpreter可执行文件(跟Exp2中生成backdoor.exe的过程一样,生成后门文件),送到Virscan.VirusTotal ...

  8. MySql存储过程 CURSOR循环

    游标 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 使用步骤 声明一个游标: declare 游标名称 CU ...

  9. [Android] Android Build 时报错: java.io.IOException: Could not parse XML from android/accounts/annotations.xml

    Android构建时报错: app:lintVitalRelease[Fatal Error] :3:214: 与元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符. ...

  10. spring-cloud-sleuth 和 分布式链路跟踪系统

    ==================spring-cloud-sleuth==================spring-cloud-sleuth 可以用来增强 log 的跟踪识别能力, 经常在微服 ...