day22-Form操作动态Select数据

本文介绍如何在Django项目中使用表单(form)进行动态数据选择,包括通过自定义表单验证来动态获取下拉菜单数据以及利用ModelChoiceField实现动态数据选择的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

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

转载于:https://www.cnblogs.com/zhangqigao/articles/8985394.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值