一、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提交验证(二)的更多相关文章

  1. 框架----Django之Form提交验证(一)

    一.Form提交验证与Ajax提交验证的运用实例 Form表单提交时会刷新页面,输入失败时,输入框内内容也会随之刷新不能保留:而Ajax提交是在后台偷偷提交,不会刷新页面,因此也就可以保留页面输入框内 ...

  2. AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)

    一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...

  3. WEB框架Django之Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一 通过form实现校验字段功能 模型:mod ...

  4. 框架----Django之Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一.小试牛刀 1.创建Form类 from d ...

  5. Django之Form组件验证

    今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类)    ·前端把数据提交过来 ·匹配规则 · ...

  6. Django在form提交CSRF验证失败. 相应中断问题

    CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因. Your browser is accepting cookies. The view function passe ...

  7. Django之Form自定义验证规则

    1.数据源无法时时更新,有两种方法 方式一:重构构造方法(推荐) 方法一:重构构造方法(推荐) class ClassesForm(Form): name = fields.CharField( re ...

  8. web框架-(六)Django补充---form表单验证

    一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...

  9. Django框架基础之Form组件

    服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能:       1 验证(显示错误信息)       2 保留用户上次输入 ...

随机推荐

  1. Windows下Mongodb安装部署

    1.下载安装包 mongodb-win32-x86_64-enterprise-windows-64-3.6.4.zip 解压 安装失败(当前环境windows server2012 R2):已验证可 ...

  2. Linux 安装Zookeeper<单机版>(使用Mac远程访问)

    阅读本文需要先阅读安装Zookeeper<准备> 新建目录 mkdir /usr/local/zookeeper 解压 cd zookeeper压缩包所在目录 tar -xvf zooke ...

  3. docker部署war包到阿里云

    最近买了个阿里云服务器,配置1核2g内存,学习够了.记录下过程. 1,服务器相关,请看下图,云服务器主要配置是安全组和密钥,前者是开放端口,后者可以用于远程连接(比如我windows系统通过putty ...

  4. vim神器(学习笔记)

    #本文并非原创,属于本人学习中的记录笔记或是转存笔记,如果涉及到哪位高人的创作权益,敬请海涵! Vim 是一个上古神器,本篇文章主要持续总结使用 Vim 的过程中不得不了解的一些指令和注意事项,以及持 ...

  5. 【视频编解码·学习笔记】4. H.264的码流封装格式 & 提取NAL有效数据

    一.码流封装格式简单介绍: H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流.对于不同的应用场景,NAL规定了一种通 ...

  6. Paper Reading - Mind’s Eye: A Recurrent Visual Representation for Image Caption Generation ( CVPR 2015 )

    Link of the Paper: https://ieeexplore.ieee.org/document/7298856/ A Correlative Paper: Learning a Rec ...

  7. Appstate的几种状态及在android 和ios触发

    AppState能告诉你当前应用是在前台还是在后台,或者处于切换应用的状态,并且能在状态变化的时候通知你. AppState 通常在处理推送通知的时候用来决定内容和对应的行为 一: App State ...

  8. ES6的新特性(4)——字符串的扩展

    字符串的扩展 ES6 加强了对 Unicode 的支持,并且扩展了字符串对象. 字符的 Unicode 表示法 JavaScript 允许采用\uxxxx形式表示一个字在\u0000~\uFFFF之间 ...

  9. RIGHT-BICEP测试第二次程序

    根据Right-BICEP单元测试的方法我对我写的第二次程序进行了测试: 测试一:测试能否控制使用乘除 测试二:测试是否能加括号 测试三:是否可以控制题目输出数量 测试四:能否控制输出方式,选择文件输 ...

  10. Macbook Pro开机黑屏了。

    问题描述:点了appstore的更新,然后重启黑屏.(说明:黑屏是屏幕没亮:灰屏是屏幕亮了是灰黑色的.) 黑屏问题大,灰屏问题小. 开机按option没反应的跳到步骤四 一.数据 苹果电脑黑屏了,想搞 ...