实例背景
form表单此处的应用实例,当对输入的学生信息要进行验证,如姓名长度,性别验证以及输入的不能为空。通常原始操作是需要些一堆if条件进行验证,而此处是使用form表单对其进行验证
工程中学生类
注意姓名,性别,以及头像
from django.db import models
# Create your models here.
class Student(models.Model):
s_name = models.CharField(max_length=10,unique=True)
s_age = models.IntegerField(default=20)
s_gender = models.BooleanField(default=0)
create_time = models.DateTimeField(auto_now_add=True)
# auto_now_add 创建时,默认字段赋值为最新的事件
# create_time = models.DateField
updata_time = models.DateTimeField(auto_now=True)
# 修改数据是,自动赋值为更新字段时 的时间。
math = models.DecimalField(max_digits=3,decimal_places=1,null=True)
wuli = models.DecimalField(max_digits=3,decimal_places=1,null=True)
# 存图片地址,数据库中字段类型为varchar
icon = models.ImageField(upload_to='upload',null=True)
class Meta:
db_table = 'student'
在html中写出提交即将添加学生的代码
注意事项:
1.:日后再说
2.因为要提交图片,需要加入enctype=”multipart/form-data”
3.errors.icon.0是用表单校验后如有异常需要解析的异常
4.submit提交的是name键以及对应输入的值。
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>姓名:<input type="text" name="username">{{ errors.username.0 }}</p>
<p>性别:<input type="text" name="gender">{{ errors.gender.0 }}</p>
<p>图片:<input type="file" name="icon">{{ errors.icon.0 }}</p>
<p><input type="submit" value="提交"></p>
</form>
form表单操作
在文件夹中创建forms.py之后写入代码
注意:此处给出了单独校验性别姓名,以及合在一起校验的方法
并且在此处校验之后将会重新赋值,比如将性别改成存入数据库的布尔值0或1;
from django import forms
from app.models import Student
class StuForm(forms.Form):
username = forms.CharField(max_length=10,
min_length=2,
required=True,
error_messages={
'required':'姓名字段必填',
'min_length':'不能少于两个字符',
'max_length':'不能超过10个字符',
})
icon = forms.ImageField(required=True,
error_messages={
'required':'头像必填'
})
gender = forms.CharField(required=True,
error_messages={
'required':'性别必填'
})
# def clean(self):
# # 这是校验所有的
# # 转换性别为1或者是0
# gender = self.cleaned_data.get('gender')
# if gender == '男':
# self.cleaned_data['gender'] = 1
# else:
# self.cleaned_data['gender'] = 0
#
# # 校验姓名是唯一的
# username = self.cleaned_data.get('username')
# stu = Student.objects.filter(s_name=username).first()
# if stu:
# raise forms.ValidationError({'username':'姓名重复'})
#
# return self.cleaned_data
def clean_username(self):
# 只是校验姓名
username = self.cleaned_data.get('username')
stu = Student.objects.filter(s_name=username).first()
if stu:
raise forms.ValidationError('姓名重复')
return self.cleaned_data['username']
def clean_gender(self):
# 只是检验性别
gender = self.cleaned_data.get('gender')
if gender == '男':
self.cleaned_data['gender'] = 1
else:
self.cleaned_data['gender'] = 0
return self.cleaned_data['gender']
校验全部成功后,写入数据库的操作以及跳转操作
def add_stu_info(request):
if request.method == 'GET':
return render(request,'add_stus.html')
if request.method == 'POST':
form = StuForm(request.POST,request.FILES)
if form.is_valid():
username = form.cleaned_data['username']
icon = form.cleaned_data['icon']
# 获取的字段为1或者0
gender = form.cleaned_data['gender']
Student.objects.create(s_name=username,
icon=icon,
s_gender=gender)
return HttpResponseRedirect(reverse('app:all_stu'))
else:
errors = form.errors
return render(request,'add_stus.html',{'errors':errors})
分析:如果请求为GET请求,则跳转到学生创建页面stu_form.html。当用户在学生创建页面中填写的学生姓名、年龄、性别并点击提交后,视图函数将接收POST请求,并做如下的处理。
接收POST请求,可以分以下三步骤分析:
步骤1:在POST请求中,通过请求request中的POST属性获取页面中通过表单form提交的数据,数据中包括姓名name、年龄age、性别sex。
步骤2: 使用StudentForm表单验证request.POST中提交的数据。在表单中定义了name、age、sex字段是必填字段,并且姓名的长度不能超过10个字符,如果在页面中没有填写其中任何一个参数,或者姓名字段填写太长,则表单验证不通过。
步骤3:判断表单是否验证通过,可以使用is_valid()方法。如果表单验证成功,则返回True,否则返回False。
步骤4:如果验证表单成功,则通过Student模型进行数据存储。如果验证失败,则返回stu_form.html页面,并将form参数传递给页面。
3. 表单的错误提示
定义了校验页面中传递参数的StudentForm表单类,并且使用is_valid()方法判断表单校验是否成功。如果is_valid()的结果为False,则表示表单校验失败。form表单验证可以通过使用form.errors查询验证的错误信息。
删除学生
当在查看学生信息的页面,可以对学生进行删除的操作
首先
在此处html中添加操作列
<thread>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>头像</th>
<th>操作</th>
</thread>
然后
在此处添加删除的按钮
<td><img src="/media/{{ stu.icon }}"></td>
<td>
<a href="{% url 'app:del_stu' stu.id %}">删除</a>
</td>
删除
在查看全部学生的页面中,即可直接操作管理员。
def del_stu(request,id):
if request.method == 'GET':
Student.objects.filter(pk=id).delete()
return HttpResponseRedirect(reverse('app:all_stu'))-