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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-form-item的提示必填功能可以通过设置label的名称和校验规则来实现。在代码中,可以通过设置label的名字为"下发周期",并且设置必填的校验规则,即可实现提示必填的功能。示例代码如下: ``` <el-form-item label="下发周期" prop="cycle" rules="required"> <el-select v-model="cycleType" placeholder="请选择周期类型"> <el-option label="每天" value="day"></el-option> <el-option label="每周" value="week"></el-option> <el-option label="每月" value="month"></el-option> </el-select> </el-form-item> ``` 在上述代码中,我们使用了element-ui的el-form-item组件,并设置了label为"下发周期",同时给prop设置为"cycle",这样可以和表单数据进行双向绑定。通过设置rules为"required",即可实现必填的校验规则,如果用户没有选择周期类型,会提示"请填写任务周期"。这样就实现了el-form-item的提示必填功能。 如果需要在一个el-form-item中包含多个选择框或输入框,并且实现多个必填的功能,可以参考以下示例代码: ``` <el-form-item label="多个必填项" prop="multiple"> <el-row> <el-col :span="12"> <el-form-item label="选项1" prop="option1" rules="required"> <el-input v-model="option1Value" placeholder="请输入选项1"></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="选项2" prop="option2" rules="required"> <el-input v-model="option2Value" placeholder="请输入选项2"></el-input> </el-form-item> </el-col> </el-row> </el-form-item> ``` 在上述代码中,我们在一个el-form-item内部嵌套了两个el-form-item,分别用于包含选项1和选项2。同样地,我们给这两个内部的el-form-item设置了必填的校验规则,这样即可实现多个必填项的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [单个el-form-item中有多个必填](https://blog.csdn.net/weixin_43691818/article/details/121428871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值