• Django forms 关于select和checkbox设置初始选中值


    Django的forms和models一样很牛逼。他有两种功能,一是生成form表单,还有就是form表单的验证。

    这里主要说一下生成form表单时经常用到的需要设置 初始值 / 默认值 的情况。

    1. 前端在展示checkbox时,希望设置一个默认选中的选项。如下图:

    先来看一下form是如何定义的:

    也就是说我们要在前端生成页面的时候,让他把2那一项选中,要怎么做呢?

    方法一:

    先来看一个东西,在django/forms/widgets.py文件中,有一个字段如下图

    这里有个_empty_value字段就是设置默认值的。

    在定义form时,在构造方法中利用该字段为其配置默认选项:

    (这里可能有疑问为啥该字段的值要是个列表?因为定义的这个form类型是一个多选。。。)

    看到PEP8提示的波浪线就知道这玩意儿不是个好方法,很显然还有别的方法。

    方法二:

    利用initial,在定义form的时候设置初始值。

    方法三:

    利用initial,在生成form示例的时候设置初始值。

    2. 前端在展示select时,希望设置一个默认选中的选项。如下图:(我们这里定义了一个单选的select)

    还是先来看一下form的定义:

    我们希望在前端显示时,能够默认选中2那一项,如下图:

     这个时候基本上跟上例中都是一样的方法。

    方法一:

    还是在定义form的时候为city字段设置一个初始值

    方法二:

    生成form实例的时候为city字段设置一个初始值

    复制代码
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    # __author__ = "Q1mi"
    # Email: master@liwenzhou.com
    
    from django import forms
    
    
    class SelectTestForm(forms.Form):
        city = forms.IntegerField(
            widget=forms.Select(
                choices=(
                    (1, "BeiJing"),
                    (2, "WeiHai"),
                    (3, "RuShan"),
                ),
                attrs={
                    "class": "form-control",
                }
            ),
            required=True
        )
    
        modes = forms.TypedChoiceField(
            coerce=lambda x: x == "1",
            choices=(
                (1, "负载均衡"),
                (2, "极致性能"),
                (3, "超级无敌"),
            ),
            widget=forms.CheckboxSelectMultiple(
    
            ),
        )
    
        def __init__(self, *args, **kwargs):
            super(SelectTestForm, self).__init__(*args, **kwargs)
            # self.fields["modes"].widget._empty_value = [2, ]  # 方法1
            self.initial["modes"] = [2, ]  # 方法2
            self.initial["city"] = 2
    复制代码
    复制代码
    from django.shortcuts import render, HttpResponse
    from testapp.forms import select_test
    
    # Create your views here.
    
    
    def test(request):
        f = select_test.SelectTestForm(initial={"city": 2, "modes": [2, ]})  # 方法2
        if request.method == "POST":
            print(request.POST)
            return HttpResponse("OK")
        else:
            return render(request, "test/select_test.html", {"f": f})
    复制代码

    3. 从数据库里查询数据返回前端展示时,如何在前端的标签中选中的指定的选项。

    将数据库中查询出来的选中的authors的id作为参数传入BookForm类生成一个对象将该form对象传到前端就可以准确展示出那些选中的值

    这里如果写成f = change_book.BookForm()的话,前端只会展示出空的表单(当然select标签会默认选中第一个),不会显示出数据库中保存的对应的值。

  • 相关阅读:
    好看的WEB配色..留的美化界面用..
    为phpcms v9 后台增加按类别查找的功能,且不影响升级。
    OS开发过程中常用开源库
    stanford《Developing Apps for ios》第五课demo要点
    C语言简陋的播放mp3代码
    编译ffmpeg for iOS,并调试iFrameExtractor demo
    windows下配置nginx pathinfo模式,支持thinkphp
    初学GTK+2.0与glade的一些网络资源
    在Centos6.3中桥接方式配置vm virtualbox中的系统网络
    Foundation的基本操作—字符串、数组、字典、集合
  • 原文地址:https://www.cnblogs.com/panfb/p/8411043.html
Copyright © 2020-2023  润新知