Django的forms和models同樣很牛逼。他有兩種功能,一是生成form表單,還有就是form表單的驗證。html
這裏主要說一下生成form表單時常常用到的須要設置 初始值 / 默認值 的狀況。前端
先來看一下form是如何定義的:python
也就是說咱們要在前端生成頁面的時候,讓他把2那一項選中,要怎麼作呢?數據庫
先來看一個東西,在django/forms/widgets.py文件中,有一個字段以下圖django
這裏有個_empty_value字段就是設置默認值的。app
在定義form時,在構造方法中利用該字段爲其配置默認選項:負載均衡
(這裏可能有疑問爲啥該字段的值要是個列表?由於定義的這個form類型是一個多選。。。)ide
看到PEP8提示的波浪線就知道這玩意兒不是個好方法,很顯然還有別的方法。性能
利用initial,在定義form的時候設置初始值。ui
利用initial,在生成form示例的時候設置初始值。
仍是先來看一下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標籤會默認選中第一個),不會顯示出數據庫中保存的對應的值。
蒐集和整理資料不易,轉載請註明出處。