zoukankan      html  css  js  c++  java
  • Django之forms

    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
    form代码
    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})
    views代码

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

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

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

  • 相关阅读:
    417 Pacific Atlantic Water Flow 太平洋大西洋水流
    416 Partition Equal Subset Sum 分割相同子集和
    415 Add Strings 字符串相加
    414 Third Maximum Number 第三大的数
    413 Arithmetic Slices 等差数列划分
    412 Fizz Buzz
    410 Split Array Largest Sum 分割数组的最大值
    409 Longest Palindrome 最长回文串
    day22 collection 模块 (顺便对比queue也学习了一下队列)
    day21 计算器作业
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9122686.html
Copyright © 2011-2022 走看看