web后端Django-高潮3form表单

实例背景

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'))-

上一篇
使用centos部署django项目 layout: wtitle: web后端Django-前戏4html模板操作date: 2019-1-4 12:03:10tags: Djangocategories: web后端 前言项目从0到1
2019-01-22 lorry
下一篇
web后端Django-高潮2request,responsecookie和session, web后端Django-高潮2request,responsecookie和session,
创建配置当前的项目是为了创建账户登录以及保存在数据库方 参考高潮1,在templates中创建login.html以及register.html文件。同时拷贝高潮1中的index相关文件到当前文件夹 使用python manage.py
2019-01-09