django中的form組件提供了普通表單提交及驗證數據的主要功能:
1. 生成頁面可用的HTML標簽
2. 對用戶提交的數據進行驗證
3. 可保留用戶上次提交的數據
django中使用form組件
(一)在py文件(可以是視圖,也可新建后在視圖引入使用)創建一個form組件類,必須繼承forms.Form類(fromdjangoimportforms)
1. 類中定義的字段都可在模板中渲染成相應的HTML表單標簽
class Inform(forms.Form):
name=forms.CharField()
#CharField類實例化的字段渲染后是type='text'的input標簽(實例化參數可以改變type類型)
password=forms.CharField()
2. 類中定義的字段根據實例化該字段的類生成不同的標簽
class Inform(forms.Form):
name=forms.CharField()
password = forms.CharField(
# 字段對象的類的實例化通過插件widget修改生成的HTML標簽,attrs可以設置多個屬性
# widget=forms.TextInput(attrs={'type': 'password'}),
widget=forms.PasswordInput(render_value=True),#插件(設置保存密碼)
)
3. 類中定義的字段的類的實例化可以設置相應的參數進行配置
class Inform(forms.Form):
name = forms.CharField(
# required=True, # 默認為True
min_length=2,#最小長度
max_length=6,#最大長度
initial='張三', # 默認值
help_text='長度為2到6個字符!', # 幫助信息
error_messages=[{ #自定義錯誤提示信息(默認為英文)
'required':'不能為空!',
'min_length':'不能少於2個字符!'·
}],
validators=[],#自定義校驗規則(列表中放自定義函數名,或者引入django內置的RegexValidator校驗器)
# disabled=True#默認為True顯示
)
password = forms.CharField(
# widget=forms.TextInput(attrs={'type': 'password'}),
widget=forms.PasswordInput(),
)
(二)在相應的視圖函數中實例化該類之后,當成模板變量通過render進行模板渲染時自定義form組件中的字段都會以標簽顯示
views.py

1 from django.shortcuts import render,HttpResponse 2 from django import forms 3 from app01 import models 4 from django.core.validators import RegexValidator 5 import re 6 from django.core.exceptions import ValidationError 7 8 #自定義校驗函數,直接在字段validators中使用 9 def name_valid(value): 10 name_re=re.compile(r'^[a-zA-Z_]+$') 11 if not name_re.match(value): 12 raise ValidationError("只能以字母下划線開頭!") 13 14 class Myform(forms.Form): 15 name = forms.CharField( 16 # required=True, # 默認為True 17 min_length=2, 18 max_length=6, 19 initial='abc', # 默認值 20 help_text='長度為2到6個字符!', # 幫助信息 21 error_messages=[{ # 自定義錯誤提示信息(默認為英文) 22 'required': '不能為空!', 23 'min_length': '不能少於2個字符!' 24 }], 25 validators=[RegexValidator(r'^(\w)+$','用戶名只能有字母數字下划線組成!'), name_valid], # 自定義校驗規則(列表中放自定義函數名,或者引入django內置的RegexValidator校驗器) 26 # disabled=True#默認為True顯示 27 ) 28 # 密文 29 password = forms.CharField( 30 widget=forms.TextInput(attrs={'type': 'password'}), 31 ) 32 # 日期 33 birth = forms.DateField( 34 widget=forms.TextInput(attrs={'type': 'date'}) 35 ) 36 # 單選 37 sex = forms.ChoiceField( 38 choices=[('0', '男 '), ('1', '女')], 39 # widget=forms.Select()#下拉單選(默認) 40 # widget=forms.RadioSelect()#正常單選 41 42 # widget = forms.CheckboxInput()#記住賬號密碼(label='記住賬號密碼',initial='checked',choices=[('True',1),('False',0)]) 43 ) 44 45 publish = forms.ModelChoiceField( 46 queryset=models.Publish.objects.all() # 只能用all結果才能正常顯示,必須設置__str__,否則拿到是對象 47 # widget和ChoiceFiled一樣設置 48 ) 49 # 多選 50 hobby = forms.MultipleChoiceField( 51 52 choices=[('1', 'wan '), ('2', 'ee')], 53 # widget=forms.SelectMultiple()#下拉多選(默認) 54 # widget=forms.CheckboxSelectMultiple()#正常多選 55 ) 56 author = forms.ModelMultipleChoiceField( 57 queryset=models.Author.objects.all() # 只能用all結果才能正常顯示,必須設置__str__,否則拿到是對象 58 # widget和MultipleChoiceField一樣設置 59 ) 60 61 def __init__(self,*args,**kwargs):#初始化對字段進行樣式設置 62 super().__init__(*args,**kwargs) 63 for filed in self.fields: 64 self.fields[filed].widget.attrs.update({'class':'form-control'}) 65 66 def form(request): 67 if request.method=='GET': 68 form_obj=Myform() 69 return render(request, 'form.html', {'form_obj':form_obj}) 70 else: 71 form_obj=Myform(request.POST)#對提交的數據進行組件類實例化 72 if form_obj.is_valid():#校驗提交的數據對象(字段校驗-->validators校驗(RegexValidator模塊或者自定義函數)-->局部鈎子-->全局鈎子) 73 print(form_obj.cleaned_data)#form_obj.clean_data已經校驗完的所有值 74 return HttpResponse('ok') 75 else: 76 return render(request,'form.html',{'form_obj':form_obj})#檢測到錯誤,刷新頁面,保留原數據
form.html

1 {% load static %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> 7 <title>form</title> 8 </head> 9 <body> 10 <div class="container"> 11 <div class="row"> 12 <div class="col-xs-8 col-xs-offset-2"> 13 <h2>注冊信息表:</h2> 14 {% for field in form_obj %} 15 <p> 16 17 <label for="{{ field.id_for_label }}">{{ field.label }}</label> 18 {{ field }} 19 <span class="text-danger">{{ field.errors.0 }}</span> 20 </p> 21 {% endfor %} 22 </div> 23 </div> 24 </div> 25 </body> 26 <script src="{% static 'jquery-3.4.1.js' %}"></script> 27 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> 28 </html>