Django--form表单中的select生成方法,如果select中的选项不固定,需要怎么操作。
速查
1、固定select选项
forms
1
2
3
class 表单类名称(forms.Form):
host_type=forms.IntegerField(
widget=forms.Select(choices=列表或元组)
2、动态select选项
forms
1
2
3
4
5
6
7
admin = forms.IntegerField(
widget=forms.Select()
)
def __init__(self,*args,**kwargs): #执行父类的构造方法
super(ImportForm,self).__init__(*args,**kwargs)
self.fields['admin'].widget.choices = models.SimpleModel.objects.all().values_list('id','username')
#每次都会去数据库中获取这个列表
知识点
select的form格式是元组括元组,提交的是value(数字),字段类型是forms.IntegerField,插件widget=forms.Select(),属性choices=元组列表
面向对象中静态字段只要加载到内存就不会改变了,私有字段每次提交都刷新,原理是实例化对象的时候把静态字段进行了deepcopy到对象里,修改的时候就私有字段修改,静态字段不变。
详细
1、生成最基本的select标签
templates/home/index.html
1
2
3
4
5
6
7
8
9
<body>
<h1>录入数据</h1>
<form action="/index/">
<p>{{ obj.host_type }}</p>
<p>{{ obj.hostname }}</p>
</form>
<h1>数据列表</h1>
...
</body>
app01/urls.py
1
2
3
4
from app01.views import account,home
urlpatterns = [
url(r'^index/$',home.index ),
]app01/views/home.py
1
2
3
4
from app01.forms import home as HomeForm
def index(request):
obj = HomeForm.ImportForm(request.POST)
return render(request,'home/index.html',{'obj':obj})
app01/forms/home.py
1
2
3
4
5
6
7
8
9
10
from django import forms
class ImportForm(forms.Form):
HOST_TYPE_LIST = (
(1,'物理机'),
(2,'虚拟机')
)
host_type=forms.IntegerField(
widget=forms.Select(choices=HOST_TYPE_LIST)
)
hostname = forms.CharField()
browser
2、可变的select标签
app01/models.py
1
2
3
class SimpleModel(models.Model):
username = models.CharField(max_length=64)
password = models.CharField(max_length=64)
初始化数据库
Django-Path > python manage.py makemigrations
Django-Path > python manage.py migrate
数据库app01_simplemodel表,随便造两条数据
app01/forms/home.py中添加:
1
2
3
4
5
6
7
8
9
from app01 import models
admin = forms.IntegerField( widget=forms.Select()
)
def __init__(self,*args,**kwargs): #执行父类的构造方法 super(ImportForm,self).__init__(*args,**kwargs)
self.fields['admin'].widget.choices = models.SimpleModel.objects.all().values_list('id','username')
#每次都会去数据库中获取这个列表
index.html加入admin选项
1
<p>{{ obj.admin }}</p>