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标签会默认选中第一个),不会显示出数据库中保存的对应的值。
搜集和整理资料不易,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix