2月7日学习内容整理:Form组件补充,关于form组件对象是如何渲染出标签的,stark组件之js效果

一、form组件补充

无论我们使用modelform还是form组件,本质都是一个Form组件

我们在用的时候实例出一个对象,在模版中想要渲染出对应的字段和标签有是三种方法

1、form对象.as_p    就会自动显示出所有的字段和对应标签

2、循环这个form对象,循环出的就是每一个字段,这个字段放在模版中就是一个个的form表单标签

3、form对象.字段名    也能够渲染出对应的form表单标签

那么问题就是我们在定义form类的时候,只是写了些charfield,IntegerField,foreignkey,manytomanyfield这样的类型,那怎么就在模版中渲染出对应的标签和数据了

其实循环这个form对象得到的每一个字段对象,实际上是下面这个类的对象,也就是BoundField

from django.forms.boundfield import BoundField

from组件会利用这个BoundField对象给我们将字段转换为能够显示出对应form表单标签的类对象,也就是下面这几个,举例:

from django.forms import TypedChoiceField, TypedMultipleChoiceField

from django.forms.models import ModelChoiceField, ModelMultipleChoiceField

TypedChoiceField是针对有choices参数的字段,会渲染出一个select单选标签

补充:我们在定义form类的时候,如果写了个choicefield字段,里面的choices参数可以是一个元组套元组,但是当选项特别多的时候我们就需要从数据库中去取了,但是会有一个问题,我们如果在数据库中添加或修改了某一个选项,页面是不会即时显示出来的,因为在第一次实例这个form对象时,字段所带的数据就已经封装到字段对象里了,后面怎么刷新页面实例出的form对象取数据的时候就直接从字段对象中取,不会再走一遍数据库所以数据不会更新,解决方法就是每一次实例对象的时候用init方法从数据库取出最新的数据封装到字段对象中,这一方法的缺点就是每一次都会走数据库,所以只适用于那些经常要添加更新的数据

ModelChoiceField指的是从数据库中获取数据,并且是一对多的关系,渲染出select单选框

ModelMultipleChoiceField继承了ModelChoiceField,也指的是从数据库中取数据,并且是多对多的关系,渲染出select多选框

 

对于BoundField的几个方法,也就是循环form对象得到的每一个字段对象

for  boundfield  in   form :

boundfield.field    得到的就是form组件为我们转换用于渲染的类对象,就是上面提到的ModelChoiceField, ModelMultipleChoiceField

boundfield.field.queryset   就是对于一对多或者多对多字段对应的表的所有数据对象集合

boundfield.field.queryset.model 就是对应关联的表的类,可以用这个参数取出对应的app名和model名

boundfield.auto_id    得到的就是每个字段渲染出的form表单标签的id值

 

 

二、stark组件的js效果

模仿admin,就是在添加某一个model时,对应的一对多和多对多字段首先要有添加按钮,让我们能够在当前添加页面弹出一个窗口添加和它相关联的model数据,并且提交时关闭这个弹出的窗口并且显示在渲染的select标签中且是选中的状态

利用Window对象

window.open()方法,就是在当前窗口下弹出另一个窗口

参数:

(url , name , "width:400,height:400")

url指的是跳转的地址,就是在弹出窗口中显示怎样的页面

name和url写成一样的就行了

第三个是特征参数,可以指定窗口的宽和高

window.close()方法,就是关闭当前的窗口

 

opener对象,指的就是当前弹出的窗口

opener.函数名(参数)    这种用法就会调用当前页面中定义的方法,如果在当前页面找不到,就会从父窗口中去找

父窗口的概念:谁把当前弹出的窗口打开的谁就是这个弹出窗口的父窗口

posted @ 2018-02-08 11:50  九二零  阅读(85)  评论(0编辑  收藏  举报