Django--form生成select标签


需求

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

827870-20160322175052683-959089716.png

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表,随便造两条数据

827870-20160322175053104-25724976.png

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 >
browser

827870-20160322175053479-2124594535.png

当往数据库表中添加一个管理员时,看select标签选项

827870-20160322175053823-218544424.jpg

827870-20160322175054151-173464837.png
















转载于:https://www.cnblogs.com/daliangtou/p/5307825.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值