day22-Form操作动态Select数据

一、前言

  之前我们学过了通过model操作来动态的获取select数据,今天我们来学习一下,通过forms操作,来获取select数据,一般分为两种,另外一种是django支持的,但是我们一般推荐用第一种。

二、Forms操作动态数据

2.1、Forms验证

说明:在app01目录下创建forms.py文件,来专门存放form验证的代码

from django.forms import widgets,forms,fields
from app01 import models

class UserForm(forms.Form):

    name = fields.CharField(
        required=False,
        widget=widgets.TextInput(attrs={'class':'c1'})
    )

    email = fields.EmailField(
        max_length=12,
        widget=widgets.TextInput(attrs={"class":"c2"})
    )

    user_type = fields.ChoiceField(
        # choices=[(1,'普通用户'),(2,"超级用户")]  #获取写死的选项,这样写就不需要写下面的init方法,跟下面是一样的,都不需要些init方法。

        #这样获取只能重启web服务才能获取到,因为user_type数据静态字段,第一次执行的时候,已经加载到内存里面了,默认已经从数据库读到内存里面了,后面就不在执行了,所以只能重启服务才能获取到。
        # choices=models.UserType.objects.values_list('id','type_name'), 
     
        #因为UserForm这个类,它会把已经存在内存里的那几个静态字段(name,email,user_type,user_type2)全部深copy一份封装到obj.field中,
        #所以我下面会重新赋值,所以这边写不写值无所谓,所以我干脆就写个空
        choices=[], 
        widget=widgets.Select
    )

    user_type2 = fields.CharField(widget=widgets.Select(choices=[])) #这边的原理跟上面的一样

    def __init__(self,*args,**kwargs):
        super(UserForm,self).__init__(*args,**kwargs)
        self.fields["user_type"].choices = models.UserType.objects.values_list('id','type_name')  #因为对象是在初始化话之后,需要重新赋值的,所以我这边就直接重写了init方法
        self.fields['user_type2'].widget.choices = models.UserType.objects.values_list('id','type_name')  #因为这边是通过[(value,name)]的方式,所以这边用values_list

2.2、调用Forms验证

说明:我们需要在view.py视图函数中去调用From验证

from django.shortcuts import render

# Create your views here.

from app01 import models

def index(request):
    from app01.forms import UserForm
   # 这边可以传入参数,表示在页面上显示默认值 例:obj = UserForm('username':'shabihong'),如果是post请求的话,可以是:obj=UserForm(request.POST,request.FILES),也可以把文件拿过来
    obj = UserForm()
    # obj.fields["user_type"].choices=models.UserType.objects.values_list('id','type_name') #这边已经在init方法里面写了,所以这边就不写了
    return render(request,'index.html',{'obj':obj})

2.3、模板代码

说明:在前端显示的时候的代码

<body>
    <p>{{ obj.name }}</p>
    <p>{{ obj.email }}</p>
    <p>{{ obj.user_type }}</p>
    <p>{{ obj.user_type2 }}</p>
</body>

如图:

三、django本身操作动态Select数据

3.1、django操作select数据

说明:通过ModelChoiceField模块,django可以自己操作动态的Select数据

from django.forms import widgets,forms,fields
from django.forms.models import ModelChoiceField  #django自己帮我们提供的

class UserForm(forms.Form):
        user_type3 = ModelChoiceField(
        queryset=models.UserType.objects.all(),
        to_field_name="id",   #html中的value的值的对应字段,一般情况下只用id
        empty_label="请选择用户类型",  #默认显示内容
        )

 ModelChoiceField具体字段如下:

ModelChoiceField(ChoiceField)
    ...                        django.forms.models.ModelChoiceField
    queryset,                  # 查询数据库中的数据
    empty_label="---------",   # 默认空显示内容
    to_field_name=None,        # HTML中value的值对应的字段
    limit_choices_to=None      # ModelForm中对queryset二次筛选

具体所有字段:http://www.cnblogs.com/zhangqigao/articles/8931205.html

关于to_feild_name的使用,如图:

 

 

ModelChoiceField还有一个就是,必须跟model中的__str__函数想结合使用:

class UserType(models.Model):
    type_name = models.CharField(max_length=32)

    def __str__(self):  #必须跟__str__这个函数结合使用
        return self.type_name

3.2、视图

说明:看一下视图函数的实现

def index(request):

    from app01.forms import UserForm
    obj = UserForm()

    return render(request,'index.html',{'obj':obj})

3.4、模板实现

说明:我实现的模板函数

<body>
    <p>{{ obj.user_type3 }}</p>
</body>

这个东西,是django自带的,我们知道就行,真的,我们还是建议用第一种方式。

posted @ 2018-05-03 15:05  帅丶高高  阅读(480)  评论(0编辑  收藏  举报