框架----Django之Form提交验证(二)
一、Form提交验证之(学生表、老师表、班级表)的添加和编辑实现案例
1. 浏览器访问
http://127.0.0.1:8000/student_list/ http://127.0.0.1:8000/teacher_list/ http://127.0.0.1:8000/class_list/
2. models
from django.db import models class Classes(models.Model):
title = models.CharField(max_length=32) class Student(models.Model):
name = models.CharField(max_length=32)
email = models.CharField(max_length=32)
age = models.IntegerField()
cls = models.ForeignKey('Classes') class Teacher(models.Model):
tname = models.CharField(max_length=32)
c2t = models.ManyToManyField('Classes')
models
3. urls
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^class_list/', views.class_list),
url(r'^add_class/', views.add_class),
url(r'^edit_class/(\d+)/', views.edit_class), url(r'^student_list/', views.student_list),
url(r'^add_student/', views.add_student),
url(r'^edit_student/(\d+)/', views.edit_student), url(r'^teacher_list/', views.teacher_list),
url(r'^add_teacher/', views.add_teacher),
url(r'^edit_teacher/(\d+)/', views.edit_teacher), url(r'^test/', views.test),
]
4. views
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
from django.forms import Form
from django.forms import fields
from django.forms import widgets # **************************班级信息**************************
class ClassForm(Form):
title = fields.RegexField('全栈\d+') def class_list(request):
cls_list = models.Classes.objects.all()
return render(request,'class_list.html',{'cls_list':cls_list}) def add_class(request):
if request.method == "GET":
obj = ClassForm()
return render(request,'add_class.html',{'obj': obj})
else:
obj = ClassForm(request.POST)
if obj.is_valid():
# obj.cleaned_data # 字典
# 数据库创建一条数据
# print(obj.cleaned_data)
# models.Classes.objects.create(title=obj.cleaned_data['tt']) models.Classes.objects.create(**obj.cleaned_data)
return redirect('/class_list/')
return render(request,'add_class.html',{'obj': obj}) def edit_class(request,nid):
if request.method == "GET":
row = models.Classes.objects.filter(id=nid).first()
# 让页面显示初始值
# obj = ClassForm(data={'title': 'asdfasdfasdfas'})
obj = ClassForm(initial={'title': row.title})
return render(request,'edit_class.html',{'nid': nid,'obj':obj})
else:
obj = ClassForm(request.POST)
if obj.is_valid():
models.Classes.objects.filter(id=nid).update(**obj.cleaned_data)
return redirect('/class_list/')
return render(request,'edit_class.html',{'nid': nid,'obj':obj}) # **************************学生信息**************************
class StudentForm(Form):
name = fields.CharField(
min_length=2,
max_length=6,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
email = fields.EmailField(widget=widgets.TextInput(attrs={'class': 'form-control'}))
age = fields.IntegerField(min_value=18,max_value=25,widget=widgets.TextInput(attrs={'class': 'form-control'}))
cls_id = fields.IntegerField(
# widget=widgets.Select(choices=[(1,'上海'),(2,'北京')])
#widgets 定义生成的标签类型 select下来菜单标签从数据库取值时使用values_list
widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'),attrs={'class': 'form-control'})
) def student_list(request):
stu_list = models.Student.objects.all()
return render(request,'student_list.html',{'stu_list':stu_list}) def add_student(request):
if request.method == "GET":
obj = StudentForm()
return render(request,'add_student.html',{'obj':obj})
else:
obj = StudentForm(request.POST)
if obj.is_valid():
models.Student.objects.create(**obj.cleaned_data)
return redirect('/student_list/')
return render(request,'add_student.html',{'obj':obj}) def edit_student(request,nid):
if request.method == "GET":
row = models.Student.objects.filter(id=nid).values('name','email','age','cls_id').first()
obj = StudentForm(initial=row) #initial 只有HTML标签
return render(request,'edit_student.html',{'nid':nid,'obj': obj})
else:
obj = StudentForm(request.POST)
if obj.is_valid():
models.Student.objects.filter(id=nid).update(**obj.cleaned_data)
return redirect('/student_list/')
return render(request,'edit_student.html',{'nid':nid,'obj': obj}) # **************************老师信息**************************
from django.forms import models as form_model # 导入这个models as form_model 模块
class TeacherForm(Form):
tname = fields.CharField(min_length=2) # xx = form_model.ModelMultipleChoiceField(queryset=models.Classes.objects.all()) xx = fields.MultipleChoiceField(
# choices=models.Classes.objects.values_list('id','title'), # 写了下面的那个BUG解决这条就不用写
widget=widgets.SelectMultiple
)
def __init__(self,*args,**kwargs): # 解决刷新无法动态显示数据库内容的BUG
super(TeacherForm,self).__init__(*args,**kwargs)
self.fields['xx'].choices = models.Classes.objects.values_list('id','title') def teacher_list(request):
tea_list = models.Teacher.objects.all()
return render(request,'teacher_list.html',{'tea_list':tea_list}) def add_teacher(request):
if request.method == 'GET':
obj = TeacherForm()
return render(request,'add_teacher.html',{'obj':obj})
else:
obj = TeacherForm(request.POST)
if obj.is_valid():
xx = obj.cleaned_data.pop('xx') # pop 剔除,去掉
row = models.Teacher.objects.create(**obj.cleaned_data)
row.c2t.add(*xx) #[1,2]
return redirect('/teacher_list/')
return render(request,'add_teacher.html',{'obj':obj}) def edit_teacher(request,nid):
if request.method == 'GET':
row = models.Teacher.objects.filter(id=nid).first()
class_ids = row.c2t.values_list('id')
# print(class_ids)
# id_list = []
id_list = list(zip(*class_ids))[0] if list(zip(*class_ids)) else [] # 这是个三元表达式 if 后面的如果为真就执行if前面的,否则就执行else后面的------zip是python内置函数
# obj = TeacherForm(initial={'tname':row.tname,'xx':[1,2,3]})
obj = TeacherForm(initial={'tname': row.tname, 'xx': id_list}) # initial 初始值(也就是默认值,这里要编辑的对象输入框内要有默认的老师,select下拉框内要有默认的任教班级)
return render(request,'edit_teacher.html',{'obj':obj,'nid':nid})
else:
obj = TeacherForm(request.POST)
if obj.is_valid():
xx = obj.cleaned_data.pop('xx') # pop 剔除,去掉
row = models.Teacher.objects.filter(id=nid).update(**obj.cleaned_data)
row.c2t.add(*xx)
return redirect('/teacher_list/')
return render(request, 'edit_teacher.html', {'obj': obj}) # **************************测试**************************
from django.core.exceptions import ValidationError class TestForm(Form):
user = fields.CharField(validators=[])
pwd = fields.CharField() def clean_user(self):
v = self.cleaned_data['user']
if models.Student.objects.filter(name=v).count():
raise ValidationError('用户名已经存在')
return self.cleaned_data['user'] def clean_pwd(self):
return self.cleaned_data['pwd'] def clean(self):
# user = self.cleaned_data.get('user')
# email = self.cleaned_data.get('email')
# if models.Student.objects.filter(user=user,email=email).count():
# raise ValidationError('用户名和邮箱联合已经存在')
return self.cleaned_data # def _post_clean(self):
# """
# An internal hook for performing additional cleaning after form cleaning
# is complete. Used for model validation in model forms.
# """
# pass def test(request):
obj = TestForm(initial={'t3':[2,3]}) #默认值为2,3
obj.is_valid()
return render(request,'test.html',{'obj':obj})
views
5. templates
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>学生列表</h1>
<a href="/add_student/">添加</a>
<ul>
{% for row in stu_list %}
<li>
{{ row.name }}-{{ row.email }}-{{ row.age }}-{{ row.cls_id }}-{{ row.cls.title }}
<a href="/edit_student/{{ row.id }}/">编辑</a>
</li>
{% endfor %}
</ul>
</body>
</html>
student_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>老师列表</h1>
<div>
<a href="/add_teacher/">添加</a>
</div>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>老师姓名</th>
<th>任教班级</th>
</tr>
</thead>
<tbody>
{% for row in tea_list %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.tname }}</td>
<td>
{% for row in row.c2t.all %}
{{ row.title }}
{% endfor %}
</td>
<td>
<a href="/edit_teacher/{{ row.id }}/">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
teacher_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>班级列表</h1>
<div>
<a href="/add_class/">添加</a>
</div>
<ul>
{% for row in cls_list %}
<li>{{ row.title }} <a href="/edit_class/{{ row.id }}/">编辑</a> </li>
{% endfor %}
</ul>
</body>
</html>
class_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>添加学生</h1>
<form action="/add_student/" method="POST">
{% csrf_token %}
<p>
{{ obj.name }}
</p>
<p>
{{ obj.email }}
</p>
<p>
{{ obj.age }}
</p>
<p>
{{ obj.cls_id }}
</p>
<input type="submit" value="提交" />
</form>
</body>
</html>
add_student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="POST" action="/add_teacher/">
{% csrf_token %}
<p>
姓名:{{ obj.tname }}
</p>
<p>
班级:{{ obj.xx }}
</p>
<input type="submit" value="提交">
</form>
</body>
</html>
add_teacher.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>添加班级</h1>
<form method="POST" action="/add_class/" novalidate>
{% csrf_token %}
{{ obj.title }} {{ obj.errors.title.0 }}
<input type="submit" value="提交" />
</form>
</body>
</html>
add_class.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap-theme.css"/>
</head>
<body>
<div style="width: 500px;margin: 0 auto;">
<form class="form-horizontal" method="POST" action="/edit_student/{{ nid }}/">
{% csrf_token %}
<div class="form-group">
<label class="col-sm-2 control-label">姓名:</label> <div class="col-sm-10">
{{ obj.name }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">邮箱:</label> <div class="col-sm-10">
{{ obj.email }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">年龄:</label> <div class="col-sm-10">
{{ obj.age }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">班级:</label> <div class="col-sm-10">
{{ obj.cls_id }}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-default" value="提交" />
</div>
</div>
</form>
</div>
</body>
</html>
edit_student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>编辑老师</h1>
<form method="POST" action="/edit_teacher/{{ nid }}/">
{% csrf_token %}
{{ obj.tname }}
{{ obj.xx }}
<input type="submit" value="提交">
</form>
</body>
</html>
edit_teacher.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>编辑班级</h1>
<form method="POST" action="/edit_class/{{ nid }}/">
{% csrf_token %}
<p>
{{ obj.title }} {{ obj.errors.title.0 }}
</p>
<input type='submit' value="提交" />
</form>
</body>
</html>
edit_class.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ obj.t1 }}
{{ obj.t2 }}
{{ obj.t3 }}
{{ obj.t4 }}
{{ obj.t5 }}
</body>
</html>
test.html
6. 运行结果截图



框架----Django之Form提交验证(二)的更多相关文章
- 框架----Django之Form提交验证(一)
一.Form提交验证与Ajax提交验证的运用实例 Form表单提交时会刷新页面,输入失败时,输入框内内容也会随之刷新不能保留:而Ajax提交是在后台偷偷提交,不会刷新页面,因此也就可以保留页面输入框内 ...
- AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)
一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...
- WEB框架Django之Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一 通过form实现校验字段功能 模型:mod ...
- 框架----Django之Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一.小试牛刀 1.创建Form类 from d ...
- Django之Form组件验证
今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ...
- Django在form提交CSRF验证失败. 相应中断问题
CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...
- Django之Form自定义验证规则
1.数据源无法时时更新,有两种方法 方式一:重构构造方法(推荐) 方法一:重构构造方法(推荐) class ClassesForm(Form): name = fields.CharField( re ...
- web框架-(六)Django补充---form表单验证
一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...
- Django框架基础之Form组件
服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能: 1 验证(显示错误信息) 2 保留用户上次输入 ...
随机推荐
- mybatis SQL映射配置文件
目录 标签常见属性(备忘) 参数样例 resultType.resultMap.discriminator 自动映射 动态SQL语句 罗列Mapper中最常用部分 标签常见属性(备忘) <sel ...
- Jmeter使用HTTP代理服务器录制脚本
使用Jmeter录制脚本通常使用Badboy工具录制或者Jmeter自带的HTTP代理服务器录制脚本,这里说一下使用HTTP代理服务器录制时遇到的问题. 1. Jmeter安装 下载得到Jmeter ...
- PHP自定义生成二维码跳转地址
比较简单的一款PHP自定义生成二维码跳转地址,手机端微信扫码,自动跳转到定义好的链接.支持自定义生成二维码尺寸.间距等. 鼠标悬浮显示二维码弹出层,离开后消失.js实现,代码如下: $(fu ...
- 小白初识 - 计数排序(CountingSort)
计数排序,属于桶排序特殊的一种. 当要排序n个数据的时候,如果所处的范围不大,我们可以取其中的最大值K,并将数据分散在K个桶里面, 每个桶里面的数据都是相同的(这样省去了桶内排序的时间),然后顺序取出 ...
- New Year_2019
新年目标 1. own的项目稳定高效,业务能满足业务方需求,功能质量超出业务方期待.2. 工作中成长,包括项目的需求管理,计划排期,整体的把控能力.3. 对公司的业务了解程度达到更高程度. 个人技能目 ...
- A Product Recall 产品召回
Rick: The Board of Directors has come to a decision. Our company will take an image hit, and it's go ...
- “Hello World!”团队第六周的第五次会议
今天是我们团队“Hello World!”团队第六周召开的第五次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码 一 ...
- 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest Problem L. Lazy Coordinator
题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229511 时间限制:1s 空间限制:512MB 题目大意: 给定一个n 随后跟着2n行输入 ...
- Swift-setValuesForKeysWithDictionary
重写 setValuesForKeysWithDictionary 那么字典中可以有的字段在类中没有对应属性 class Person : NSObject { var age :Int = // 重 ...
- OSG学习:使用OSG中预定义的几何体
常用的内嵌几何体包括: osg::Box //正方体 osg::Capsule //太空舱 osg::Cone //椎体 osg::Cylinder //柱体 osg::HeightField //高 ...