Django初识(6.常用视图之CreateView)

在之前Django初识(3.常用视图之ListView视图)中我们提到了有五大常用视图,其中要实现增这样一个操作会用到CreateView视图,表格中还提到使用CreateView同时需要Model和Form,那么我们首先来看一下Form。

Form主要分为两种:

  • Form(数据要手动验证,手动定义每个字段,跟Model无关)
  • ModelForm(会一对一关联的model类名,直接使用Model中所定义的字段)

Form

配置forms.py文件

forms.py文件主要就是存放form相关的东西,不管是使用普通的form还是ModelForm都是在里面编写form代码。

from django import forms

class CreatePersonForm(forms.Form):
    name = forms.CharField(max_length=32)
    age = forms.IntegerField()
    gender = forms.BooleanField()
    id_card = forms.IntegerField()
    address = forms.CharField(max_length=255)
    temperature = forms.FloatField()

可以看到普通form编写其实是和model基本相同,唯一不同的就是model中使用models.###,而form中使用forms.###。

在终端中的一些操作

和model相同,我们也可以在终端中导入form来进行操作,同样的需要运行python manage.py shell进入命令交互界面,然后导入我们需要操作的Form类:

from Django01_app02.forms import CreatePersonForm 

在终端中先实例化出来一个form,给form赋值

>>> form=CreatePersonForm(data={'name':'王二狗','age':15,'gender':2,'id_card':123456789,'address':''})  
>>> form
<CreatePersonForm bound=True, valid=Unknown, fields=(name;age;gender;id_card;address;temperature)>

在上面我们并没有给form所有参数进行赋值,而且当我们查看form时发现里面bound=True,valid=Unknow,意思是说我们成功的data数据传入form中,但是还没有验证。我们进行手动验证,利用form.is_valid()就可以验证数据了。

>>> form.is_valid() 
False
>>> form
<CreatePersonForm bound=True, valid=False, fields=(name;age;gender;id_card;address;temperature)>

验证过之后出现了False,再来查看form时发现里面valid=False,表明我们并没有验证成功,这是为什么呢,利用form.errors查看错误,发现是因为刚才我们在赋值的时候没有填写address,temperature所以验证不通过。

>>> form.errors
{'address': ['This field is required.'], 'temperature': ['This field is required.']}

通常遇到验证不通过的情况就需要我们执行另外的操作,把它抛出异常或者是把异常渲染到前端,接着我们把form中验证未通过的两个参数赋值,之后进行验证便可成功通过,并且没有错误信息。之后便可以在视图里面进行数据的保存以及返回到某一个页面。

>>> form=CreatePersonForm(data={'name':'王二狗','age':15,'gender':2,'id_card':123456789,'address':'北京市','temperature':37})     
>>> form                                                                                                                      
<CreatePersonForm bound=True, valid=Unknown, fields=(name;age;gender;id_card;address;temperature)>
>>> form.is_valid()
True
>>> form            
<CreatePersonForm bound=True, valid=True, fields=(name;age;gender;id_card;address;temperature)>
>>> form.errors                                                                                         
{}

需要注意的是:因为form和model没关系,所以即使是在form中验证成功了,在保存数据的时候依旧回报错,form中验证的是写在form中的限定条件,这个条件不一定和model中的一致,就比如我们现在gender=2,form并没有验证出来错误,但是在model中上传数据时因为限定了gender只能为1或0,所以就会报错。

编写Views(利用View)

定义get方法获取到页面(利用render函数渲染页面)

class PersonCreate(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'Django01_app02/peraon_craete.html')

    def post(self, request, *args, **kwargs):
        #验证数据
        data = request.POST
        form =CreatePersonForm(data=data)
        if form.is_valid():
            #保存数据
            person=Person(
                name=form.cleaned_data['name'],
                age=form.cleaned_data['age'],
                gender=form.cleaned_data['gender'],
                id_card=form.cleaned_data['id_card'],
                address=form.cleaned_data['address'],
                temperature=form.cleaned_data['temperature'],
            )
            person.save()
        else:
            raise Exception
        #跳转
        return HttpResponseRedirect(reverse('personal:peraon_list'))

编写Html

form中action,url反向解析,method可以提交(post)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登记人员信息</title>
</head>
<body>
  <form action='{% url 'personal:peraon_create' %}' method="post">
{#    <form action='' method="post">#}
{#    两者效果相同 action不填就默认为提交到当前的页面,但暂时不知道加上参数与不加的区别#}
    {% csrf_token %}
    <p><label>名字:<input type="text" name="name"></label></p>
    <p><label>年龄:<input type="number" name="age"></label>
    <p><label>性别:<select  name="gender">
      <option>请选择</option>
      <option value="1">男</option>
      <option value="0">女</option>
    </select></label></p>
    <p><label>身份证:<input type="number" name="id_card"></label></p>
    <p><label>地址:<input type="text" name="address"></label></p>
    <p><label>体温:<input type="number" name="temperature" step="0.1"></label></p>
    <p><button type="submit">保存</button></p>
  </form>
</body>
</html>

urls

#Django01_app02/urls.py
from django.urls import path

from Django01_app02.views import *
app_name='Django01_app02'
urlpatterns = [
    path('list/', PersonList.as_view(),name='peraon_list'),
    path('craete/', PersonCreate.as_view(),name='peraon_create')
]

 完成所有操作后我们便可以运行程序来打开页面,当然首先我们跳转到的是person_list的页面,那么怎样从person_list页面跳转到person_create页面,只需要在person_list.html中table表单下加上一句代码即可

<p><a href={% url 'personal:peraon_create' %}>登记</a></p>

 结果如下:

 点击登记按钮跳转到:

 然后我们可以填写,点击保存再次跳转到list界面并显示出刚才保存的信息。

ModelForm

        在写表单的时候,会发现表单中的Field和模型中的Field基本上是一模一样的。而且一般情况下表单中需要验证的数据就是我们模型中需要保存的数据。那么这个时候我们就可以将模型中的字段和表单中的字段进行绑定

        比如我们的数据库中有这样一张疫情人员信息表,字段有姓名,年龄,性别,住址,体温,等等一大堆信息,现在让你写一个创建疫情人员信息的页面,你的后台应该怎么写呢?

  1.     前端:首先会在前端一个一个罗列出这些字段,让用户去填写,然后后台一个一个接收用户的输入
  2.     后台:定义一个疫情人员模型,用来保存疫情人员信息
  3.     后台:定义一个疫情人员表单,用来验证前端传递过来的数据
  4.     后台:在视图函数中使用get()方法来一个一个的获取已通过验证的数据,然后使用模型中的QuerySet方法将数据保存起来

        我们在上面就是使用的普通Form来进行的,但是在上面示例中:其实表单的定义和模型的定义其实是差不多的,但是如果按照上面这种方式来的话,一个差不多的东西我们就需要完整的定义两边,这样就显得混麻烦了

        因此Django就提供了ModelForm组件:这个组件主要就是用来整合表单和模型,将它们两个连接起来使用。就不需要完整的定义两次了

配置forms.py文件

1. 必须继承forms.ModelForm

2. class Meta:

  • model = "        #一对一关联的model类名"
  • fields = "__all__"        #表示model类里面所有的字段都展示(需要验证),也可以自定义字段
  • exclude=None,          # 排除字段      (被排除的字段不需要需要验证)
  • widgets=None,          # 自定义插件      
  • error_messages=None,    # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
  • labels=None,                     # 提示信息
  • help_texts=None,                 # 帮助提示信息
  • localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据

要想使用modelform,也必须先写个modelform

class PersonCreateForm(forms.ModelForm):
    class Meta:
        model = Person
        fields='__all__'

配置Views(利用CreatView)

class PersonCreate(CreateView):
    form_class = PersonCreateForm
    model = Person
    template_name = 'Django01_app02/peraon_craete.html'
    success_url = reverse_lazy('personal:peraon_list')

编写Html

不需要自定义form表单,在html中用{{ form }}即可展示表单。加上.as_p可以使表单中每个字段换行。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登记人员信息</title>
</head>
<body>
  <form action='{% url 'personal:peraon_create' %}' method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <p><button type="submit">保存</button></p>
  </form>
</body>
</html>

 运行结果如下:

但是由model自动生成的表单是和model中定义的字段相同是英文,这时我们就可以利用modelform中 class Meta里面的labels属性进行一个重命名的操作,只需要在 class Meta下添加如下代码即可。

labels= {'name':'姓名','age':'年龄','gender':'性别','id_card':'身份证','address':'地址','temperature':'体温'}

 修改完成后再此次运行:

 到此为止我们对CreatView视图以及Form,ModelForm有了初步了解。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。 视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。 视图的优点: 1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2.用户通过简单的查询可以从复杂查询中得到结果。 3.维护数据的独立性,试图可从多个表检索数据。 4.对于相同的数据可产生不同的视图视图分为简单视图和复杂视图: 1、简单视图只从单表里获取数据,复杂视图从多表; 2、简单视图不包含函数和数据组,复杂视图包含; 3、简单视图可以实现DML操作,复杂视图不可以。 语法结构:创建视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 语法解析: OR REPLACE :若所创建的试图已经存在,则替换旧视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用); NOFORCE :如果基表不存在,无法创建视图,该项是默认选项(只有基表都存在ORACLE才会创建该视图)。 alias:为视图产生的列定义的别名; subquery :一条完整的SELECT语句,可以在该语句中定义别名; WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。 案例3:基于EMP表和DEPT表创建视图 代码演示:视图 SQL> CREATE OR REPLACE VIEW EMPDETAIL 2 AS 3 SELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAME 4 FROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO 5 WITH READ ONLY 6 / VIEW CREATED SQL> SELECT * FROM EMPDETAIL; ① EMPNO ENAME JOB HIREDATE DEPTNO DNAME 7369 SMITH CLERK 17-12月-80 20 RESEARCH 7499 ALLEN SALESMAN 20-2月 -81 30 SALES 7521 WARD SALESMAN 22-2月 -81 30 SALES 7566 JONES MANAGER 02-4月 -81 20 RESEARCH 7654 MARTIN SALESMAN 28-9月 -81 30 SALES 7698 BLAKE MANAGER 01-5月 -81 30 SALES 7782 CLARK MANAGER 09-6月 -81 10 ACCOUNTING 7788 SCOTT ANALYST 19-4月 -87 20 RESEARCH 7839 KING PRESIDENT 17-11月-81 10 ACCOUNTING 7844 TURNER SALESMAN 08-9月 -81 30 SALES 7876 ADAMS CLERK 23-5月 -87 20 RESEARCH 7900 JAMES CLERK 03-12月-81 30 SALES 7902 FORD ANALYST 03-12月-81 20 RESEARCH 7934
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慵懒之龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值