一、前言
之前我们学过了通过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自带的,我们知道就行,真的,我们还是建议用第一种方式。