一,django 的form知識html
1,利用views.py生成form表單git
(1)views.py from表單代碼正則表達式
from django import forms from django.forms import widgets from django.forms import fields class FM(forms.Form): # 字段自己只作驗證 user = fields.CharField( error_messages={'required': '用戶名不能爲空.'}, #required 爲錯誤時提示的內容 widget=widgets.Textarea(attrs={'class': 'c1'}), label="用戶名", ) pwd = fields.CharField( max_length=12, min_length=6, error_messages={'required': '密碼不能爲空.', 'min_length': '密碼長度不能小於6', "max_length": '密碼長度不能大於12'}, widget=widgets.PasswordInput(attrs={'class': 'c2'}) ) email = fields.EmailField(error_messages={'required': '郵箱不能爲空.','invalid':"郵箱格式錯誤"})
(2)templates代碼數據庫
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/fm/" method="POST"> {% csrf_token %} <p>{{ obj.user }} {{ obj.errors.user.0 }}</p> #已字典的形式,獲取後端返回的obj對象,並經過obj.user 生成input標籤 <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p> #obj.error爲後端返回的一個ErrorDict,經過.user獲取user標籤的錯誤信息標籤,在加.0獲取錯誤信息的內容 <p>{{ obj.email }}{{ obj.errors.email.0 }}</p> <input type="submit" value="提交" /> </form> </body> </html>
(3)views.py 主函數代碼django
from app01 import models def fm(request): if request.method == "GET": obj = FM() #生成FM的對象,用戶已get方法請求時,將obj對象返回到html頁面 return render(request,'fm.html',{'obj': obj}) elif request.method == "POST": obj = FM(request.POST) r1 = obj.is_valid() if r1: #print(obj.cleaned_data) #若是輸入的值正確,用戶輸入的內容將以字典的當時提交給後臺 models.UserInfo.objects.create(**obj.cleaned_data) #後臺獲取數據後,能夠直接寫入數據庫 else: return render(request,'fm.html', {'obj': obj})
2,生成其它html後端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/fm/" method="POST"> {% csrf_token %} {{ obj.as_p }} #生成p標籤包裹的input標籤 {{ obj.as_ul }} #生成ul標籤包裹的input標籤 <tables> {{ obj.as_tables}} #生成tables標籤包裹的input標籤 </tables> <input type="submit" value="提交" /> </form> </body> </html>
3,自定義生成的標籤類型以及樣式app
django中自動生成form標籤,是利用了django內置的forms類的一個widgets 方法,自定義生成form標籤類型方法以下函數
from django.forms import widgets class FM(forms.Form): # 字段自己只作驗證 user = fields.CharField( error_messages={'required': '用戶名不能爲空.'},
widget=widgets.Textarea #定義標籤的類型爲Textarea widget=widgets.Textarea(attrs={'class': 'c1'}), #這裏定義widget插件的類型爲Textarea,而且爲這個Textarea添加一個c1樣式,也能夠以key-value的形式添加自定義樣式 label="用戶名", )
4,Form類,建立form類時會定義一些字段和插件,字段用來作數據驗證,插件用來生成htmlui
(1)django的內置字段插件
Field required=True, 是否容許爲空 widget=None, HTML插件 label=None, 用於生成Label標籤或顯示內容 initial=None, 初始值 help_text='', 幫助信息(在標籤旁邊顯示) error_messages=None, 錯誤信息 {'required': '不能爲空', 'invalid': '格式錯誤'} show_hidden_initial=False, 是否在當前插件後面再加一個隱藏的且具備默認值的插件(可用於檢驗兩次輸入是否一直) validators=[], 自定義驗證規則 localize=False, 是否支持本地化 disabled=False, 是否能夠編輯 label_suffix=None Label內容後綴 CharField(Field) max_length=None, 最大長度 min_length=None, 最小長度 strip=True 是否移除用戶輸入空白 IntegerField(Field) max_value=None, 最大值 min_value=None, 最小值 FloatField(IntegerField) ... DecimalField(IntegerField) max_value=None, 最大值 min_value=None, 最小值 max_digits=None, 總長度 decimal_places=None, 小數位長度 BaseTemporalField(Field) input_formats=None 時間格式化 DateField(BaseTemporalField) 格式:2015-09-01 TimeField(BaseTemporalField) 格式:11:12 DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 DurationField(Field) 時間間隔:%d %H:%M:%S.%f ... RegexField(CharField) regex, 自定製正則表達式 max_length=None, 最大長度 min_length=None, 最小長度 error_message=None, 忽略,錯誤信息使用 error_messages={'invalid': '...'} EmailField(CharField) ... FileField(Field) allow_empty_file=False 是否容許空文件 ImageField(FileField) ... 注:須要PIL模塊,pip3 install Pillow 以上兩個字典使用時,須要注意兩點: - form表單中 enctype="multipart/form-data" - view函數中 obj = MyForm(request.POST, request.FILES) URLField(Field) ... BooleanField(Field) ... NullBooleanField(BooleanField) ... ChoiceField(Field) ... choices=(), 選項,如:choices = ((0,'上海'),(1,'北京'),) required=True, 是否必填 widget=None, 插件,默認select插件 label=None, Label內容 initial=None, 初始值 help_text='', 幫助提示 ModelChoiceField(ChoiceField) ... django.forms.models.ModelChoiceField queryset, # 查詢數據庫中的數據 empty_label="---------", # 默認空顯示內容 to_field_name=None, # HTML中value的值對應的字段 limit_choices_to=None # ModelForm中對queryset二次篩選 ModelMultipleChoiceField(ModelChoiceField) ... django.forms.models.ModelMultipleChoiceField TypedChoiceField(ChoiceField) coerce = lambda val: val 對選中的值進行一次轉換 empty_value= '' 空值的默認值 MultipleChoiceField(ChoiceField) ... TypedMultipleChoiceField(MultipleChoiceField) coerce = lambda val: val 對選中的每個值進行一次轉換 empty_value= '' 空值的默認值 ComboField(Field) fields=() 使用多個驗證,以下:即驗證最大長度20,又驗證郵箱格式 fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) MultiValueField(Field) PS: 抽象類,子類中能夠實現聚合多個字典去匹配一個值,要配合MultiWidget使用 SplitDateTimeField(MultiValueField) input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y'] input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] FilePathField(ChoiceField) 文件選項,目錄下文件顯示在頁面中 path, 文件夾路徑 match=None, 正則匹配 recursive=False, 遞歸下面的文件夾 allow_files=True, 容許文件 allow_folders=False, 容許文件夾 required=True, widget=None, label=None, initial=None, help_text='' GenericIPAddressField protocol='both', both,ipv4,ipv6支持的IP格式 unpack_ipv4=False 解析ipv4地址,若是是::ffff:192.0.2.1時候,可解析爲192.0.2.1, PS:protocol必須爲both才能啓用 SlugField(CharField) 數字,字母,下劃線,減號(連字符) ... UUIDField(CharField) uuid類型 ...
(2)django內置插件
TextInput(Input) NumberInput(TextInput) EmailInput(TextInput) URLInput(TextInput) PasswordInput(TextInput) HiddenInput(TextInput) Textarea(Widget) DateInput(DateTimeBaseInput) DateTimeInput(DateTimeBaseInput) TimeInput(DateTimeBaseInput) CheckboxInput Select NullBooleanSelect SelectMultiple RadioSelect CheckboxSelectMultiple FileInput ClearableFileInput MultipleHiddenInput SplitDateTimeWidget SplitHiddenDateTimeWidget SelectDateWidget
5,生成choice下拉框
from django import forms from django.forms import widgets from django.forms import fields class FM(forms.Form): city1 = fields.ChoiceField( choices=[(0,'上海'),(1,'廣州'),(2,'東莞')] #生成單選的choice ) city2 = fields.MultipleChoiceField( choices=[(0,'上海'),(1,'廣州'),(2,'東莞')] #生成多選的choice #html代碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/fm/" method="POST"> {% csrf_token %} {{ obj.city1 }} {{ obj.city2 }} <input type="submit" value="提交" /> </form> </body> </html>
6,經常使用插件使用
# 單radio,值爲字符串 # user = fields.CharField( # initial=2, # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),)) # ) # 單radio,值爲字符串 # user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), # initial=2, # widget=widgets.RadioSelect # ) # 單select,值爲字符串 # user = fields.CharField( # initial=2, # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),)) # ) # 單select,值爲字符串 # user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), # initial=2, # widget=widgets.Select # ) # 多選select,值爲列表 # user = fields.MultipleChoiceField( # choices=((1,'上海'),(2,'北京'),), # initial=[1,], # widget=widgets.SelectMultiple # ) # 單checkbox # user = fields.CharField( # widget=widgets.CheckboxInput() # ) # 多選checkbox,值爲列表 # user = fields.MultipleChoiceField( # initial=[2, ], # choices=((1, '上海'), (2, '北京'),), # widget=widgets.CheckboxSelectMultiple # )
7,生成html頁面的默認值
from app01 import models def fm(request): if request.method == "GET": dic = { # 從數據庫中把數據獲取到,並生成一個字典 "user": 'r1', 'pwd': '123123', 'email': 'sdfsd', 'city1': 1, 'city2': [1,2] } obj = FM(initial=dic) #將字典傳給FM類 return render(request,'fm.html',{'obj': obj})