一篇文章淺析Django Form組件相關(guān)知識
回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書
前言
在上一篇時,我們小試牛刀了以下Django Form組件的使用,一篇文章帶你了解Django Form組件(入門篇),沒來得及的小伙伴可以一起看看。但是你可能會有很多疑問,并不知道怎么使用。
并且知道Form組件的功能。
生成HTML標(biāo)簽。
驗(yàn)證提交的數(shù)據(jù)。
保留提交之前的數(shù)據(jù)。
所以本篇就接著上次的繼續(xù),來一起學(xué)習(xí)以下Django Form組件如何使用。
Form組件的理解
沒有使用Form組件時
在一般情況下,我們?nèi)绻帉戄斎肟驎r,在Html中,一般都是這樣寫的。
代碼
...<form method="post" action="" novalidate><div><label>用戶名:label><input type="text" name="uname">div><div><label>密碼:label><input type="text" name="upwd">div><div><input type="submit">div>form>...
實(shí)現(xiàn)效果

使用Form組件時
在使用Form組件時,我們通常需要定義Form類。
這個Form,里面的字段,就可以理解為input標(biāo)簽,只不過是在后端寫的。
Form類
from django.forms import Formclass LoginForm(Form):uname = fields.CharField(label="用戶名")upwd = fields.CharField(label="密碼")
views.py
from django.shortcuts import renderdef login(request):form = LoginForm()return render(request, "login_f.html", {"form": form})
html
...<form method="post" action="" novalidate><div><label>{{ form.uname.label }}:label>{{ form.uname }}{{ form.uname.errors.0 }}div><div><label>{{ form.upwd.label }}:label>{{ form.upwd }}{{ form.upwd.errors.0 }}div><div><input type="submit">div>form>...
小總結(jié)
可以發(fā)現(xiàn),我并沒有寫input代碼,而是直接調(diào)用后端的form.<字段名>出來的。
Form類生成的Html

可以發(fā)現(xiàn),基本上和自己寫的Html差不多,生成的id為id+<字段名>。
Form生成的Html和手動寫Html對應(yīng)圖

通過對應(yīng)圖確定,通過后端的form.<字段>生成的直接就是input標(biāo)簽。
好了,到這,就確定了Form類,就是為我們生成input標(biāo)簽的。
Form使用
使用有以下步驟。
1.創(chuàng)建Form類,盡可能和models對上。
class LoginForm(Form):uname = fields.CharField(label="用戶名")upwd = fields.CharField(label="密碼")
因?yàn)镕orm提交的數(shù)據(jù),可以轉(zhuǎn)換成dict,key就是Form字段名。
如果Form字段和models對上,直接models.<模型類>.objects.create(**dict)。
2.如果是GET請求,實(shí)例化Form對象,并且返回頁面。
def login(request):if request.method == 'GET':form = LoginForm()return render(request, "login_f.html", {"form": form})
3.如果是POST請求,實(shí)例化Form對象時,傳入request.POST,request.FILES,并且驗(yàn)證。
# 接著上面elif request.method == "POST":form = LoginForm(request.POST, request.FILES)########### 驗(yàn)證數(shù)據(jù)if form.is_valid():# 驗(yàn)證成功# 驗(yàn)證成功之后的數(shù)據(jù),key就是Form類的字段名print(form.cleaned_data) # {'uname': '1212', 'upwd': '1212'}return HttpResponse("ok")# 驗(yàn)證失敗# 雖然返回的還是頁面# 但是form會把上次輸入框內(nèi)容保存下來,并且還會展示errors信息????????return?render(request,?"login_f.html",?{"form":?form})
4.前端使用后端傳過來的form對象。
方式一,點(diǎn)每個字段
<form method="post" action="" novalidate><div><label>{{ form.uname.label }}:label>{{ form.uname }}{{ form.uname.errors.0 }}div><div><label>{{ form.upwd.label }}:label>{{ form.upwd }}{{ form.upwd.errors.0 }}div><div><input type="submit">div>form>
方式二,循環(huán)form對象
form對象是可以循環(huán)的,循環(huán)的每個form對象就是每個字段對象。
<form method="post" action="" novalidate>{% for foo in form %}<div><label>{{ foo.label }}:label>{{ foo }}{{ foo.errors.0 }}div>{% endfor %}<div><input type="submit">div>form>
所以,如果一個表有很多的字段時,盡可能的采用循環(huán)方式。
Form字段
Form組件主要是幫助我們做驗(yàn)證的,所以,當(dāng)然有很多參數(shù)比如:
否可以為空。
label展示的內(nèi)容。
等...
常用字段
Field類為所有字段的基類
Field參數(shù)如下
required=True,是否允許為空,默認(rèn)True,不能為空widget=None,插件,展示的input具體信息label=None,label,標(biāo)簽展示的內(nèi)容help_text="",幫助信息(在標(biāo)簽旁邊顯示)error_massages=None,錯誤信息{"required":"不能為空",...}show_hidden_initial=False,是否在當(dāng)前插件后再加一個隱藏且具有默認(rèn)值的插件(可用于驗(yàn)證兩次輸入是否一致)validators=[],自定義驗(yàn)證規(guī)則函數(shù)localize=False,是否支持本地化disabled=False,是否可以編輯label_suffix=None,Label內(nèi)容后綴
CharField(Field),比較常用的字段之一
min_length=None,最小長度max_length=None,最大長度strip=True,是否移除輸入空白
IntegerField(Field)
max_value=None,最大值min_value=None,最小值
DecimalField(IntegerField)
max_value=None,最大值min_value=None,最小值max_digits=None,最大長度decimal_places=None,小數(shù)位長度
其他字段還有
BaseTemporalField(Field)DateField(BaseTemporalField)TimeField(BaseTemporalField)DateTimeField(BaseTemporalField)DurationField(Field)RegexField(CharField)EmailField(CharField)FileField(Field)ImageField(FileField)URLField(Field)BooleanField(Field)NullBooleanField(BooleanField)
...還有很多字段,這里就不一一贅述了,具體詳見官網(wǎng):
https://docs.djangoproject.com/zh-hans/2.0/ref/forms/api/#django.forms.BoundField多選字段
ChoiceField(Field)...choices=() # 選項(xiàng),如:choices = ((1,'一班'),(2,'二班'),)required=True # 是否必填widget=None # 插件,默認(rèn)select插件label=None # Label內(nèi)容initial=None # 初始值help_text='' # 幫助提示from django.forms.models import ModelChoiceField# 單選ModelChoiceField(ChoiceField)queryset=None # 查詢數(shù)據(jù)庫中的數(shù)據(jù)empty_label="---------" # 默認(rèn)空顯示內(nèi)容to_field_name=None # HTML中value的值對應(yīng)的字段limit_choices_to=None # ModelForm中對queryset二次篩選# 多選from django.forms.models import ModelMultipleChoiceFieldModelMultipleChoiceField(ModelChoiceField)...
widget參數(shù)對應(yīng)的插件
即使字段是CharField,但是最終效果以插件為主!
TextInput(Input)NumberInput(TextInput)EmailInput(TextInput)URLInput(TextInput)PasswordInput(TextInput)HiddenInput(TextInput)Textarea(Widget)DateInput(DateTimeBaseInput)DateTimeInput(DateTimeBaseInput)TimeInput(DateTimeBaseInput)CheckboxInputSelectNullBooleanSelectSelectMultipleRadioSelectCheckboxSelectMultipleFileInputClearableFileInputMultipleHiddenInputSplitDateTimeWidgetSplitHiddenDateTimeWidgetSelectDateWidget
widget示例
from django.forms import fields, widgetsfrom django.forms import Formuser = fields.CharField(initial=2,widget=widgets.RadioSelect(choices=((1,'一班'),(2,'二班'),)))# oruser = fields.ChoiceField(choices=((1,'一班'),(2,'二班'),),initial=2,widget=widgets.RadioSelect)# 多選select,值為列表user = fields.MultipleChoiceField(choices=((1,'一班'),(2,'二班'),),initial=[1,],widget=widgets.SelectMultiple)# 從數(shù)據(jù)庫中獲取多選# 方式一from django.forms import Formfrom django.core.validators import RegexValidatorclass Form類(Form):user = fields.ChoiceField(# choices=((1,'一班'),(2,'二班'),),initial=2,widget=widgets.Select)def __init__(self, *args, **kwargs):super(MyForm,self).__init__(*args, **kwargs)# self.fields['user'].widget.choices = ((1,'一班'),(2,'二班'),)# 或self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')# 方式二from django.forms import models as form_modelclass Form類(Form):depart = form_model.ModelMultipleChoiceField(queryset=models.Depart.objects.all())
總結(jié)
本篇先從入門角度說如何使用簡單使用Django Form組件,使用Form組件和沒使用Form組件的區(qū)別。
然后講了以下Form如何使用。
首先GET請求時,返回頁面。
POST請求時,驗(yàn)證數(shù)據(jù),判斷是否符合規(guī)則。
如果失敗返回錯誤信息,如果成功繼續(xù),寫入數(shù)據(jù)庫。
最后列舉出常用的Form字段,還有如何使用多選字段。
如果在操作過程中有任務(wù)問題,記得下面留言,我們看到會第一時間解決問題。
態(tài)度決定高度,習(xí)慣主宰人生。如果覺得還不錯,記得動手點(diǎn)贊以下哈。感謝你的觀看。
想學(xué)習(xí)更多關(guān)于Python的知識,可以參考學(xué)習(xí)網(wǎng)址:http://pdcfighting.com/,點(diǎn)擊閱讀原文,可以直達(dá)噢~
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點(diǎn)個【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
