Django Form和ModelForm元件
阿新 • • 發佈:2018-12-27
本文來自https://www.cnblogs.com/liwenzhou/p/8747872.html
總結一下,其實form元件的主要功能如下:
- 生成頁面可用的HTML標籤
- 對使用者提交的資料進行校驗
- 保留上次輸入內容
例項:
先定義好一個RegForm類:
from django import forms # 按照Django form元件的要求自己寫一個類 class RegForm(forms.Form): name = forms.CharField(label="使用者名稱") pwd = forms.CharField(label="密碼")
再寫一個檢視函式:
# 使用form元件實現註冊方式 def register2(request): form_obj = RegForm() if request.method == "POST": # 例項化form物件的時候,把post提交過來的資料直接傳進去 form_obj = RegForm(request.POST) # 呼叫form_obj校驗資料的方法 if form_obj.is_valid(): return HttpResponse("註冊成功") return render(request, "register2.html", {"form_obj": form_obj})
register2.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>註冊2</title> </head> <body> <form action="/reg2/" method="post" novalidate autocomplete="off"> {% csrf_token %} <div> <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label> {{ form_obj.name }} {{ form_obj.name.errors.0 }} </div> <div> <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label> {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }} </div> <div> <input type="submit" class="btn btn-success" value="註冊"> </div> </form> </body> </html>
常用欄位與外掛
建立Form類時,主要涉及到 【欄位】 和 【外掛】,欄位用於對使用者請求資料的驗證,外掛用於自動生成HTML;
initial
初始值,input框裡面的初始值。
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="使用者名稱", initial="張三" # 設定預設值 ) pwd = forms.CharField(min_length=6, label="密碼")
error_messages
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="使用者名稱", initial="張三", error_messages={ "required": "不能為空", "invalid": "格式錯誤", "min_length": "使用者名稱最短8位" } ) pwd = forms.CharField(min_length=6, label="密碼")
password
class LoginForm(forms.Form): ... pwd = forms.CharField( min_length=6, label="密碼", widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True) )
radioSelect(單選框,不是下拉式的)
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="使用者名稱", initial="張三", error_messages={ "required": "不能為空", "invalid": "格式錯誤", "min_length": "使用者名稱最短8位" } ) pwd = forms.CharField(min_length=6, label="密碼") gender = forms.fields.ChoiceField( choices=((1, "男"), (2, "女"), (3, "保密")), label="性別", initial=3, widget=forms.widgets.RadioSelect() )
單選Select
class LoginForm(forms.Form): ... hobby = forms.fields.ChoiceField( choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ), label="愛好", initial=3, widget=forms.widgets.Select() )
多選Select
class LoginForm(forms.Form): ... hobby = forms.fields.MultipleChoiceField( choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ), label="愛好", initial=[1, 3], widget=forms.widgets.SelectMultiple() )
單選checkbox
class LoginForm(forms.Form): ... keep = forms.fields.ChoiceField( label="是否記住密碼", initial="checked", widget=forms.widgets.CheckboxInput() )
多選checkbox
class LoginForm(forms.Form): ... hobby = forms.fields.MultipleChoiceField( choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),), label="愛好", initial=[1, 3], widget=forms.widgets.CheckboxSelectMultiple() )
choice欄位注意事項
在使用選擇標籤時,需要注意choices的選項可以配置從資料庫中獲取,但是由於是靜態欄位 獲取的值無法實時更新,需要重寫構造方法從而實現choice實時更新。