新聞中心
前言

紅旗網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
在上一篇時(shí),我們小試牛刀了以下Django Form組件的使用,一篇文章帶你了解Django Form組件(入門篇),沒來得及的小伙伴可以一起看看。但是你可能會(huì)有很多疑問,并不知道怎么使用。
并且知道Form組件的功能。
- 生成HTML標(biāo)簽。
- 驗(yàn)證提交的數(shù)據(jù)。
- 保留提交之前的數(shù)據(jù)。
所以本篇就接著上次的繼續(xù),來一起學(xué)習(xí)以下Django Form組件如何使用。
Form組件的理解
沒有使用Form組件時(shí)
在一般情況下,我們?nèi)绻帉戄斎肟驎r(shí),在Html中,一般都是這樣寫的。
代碼
- ...
- ...
實(shí)現(xiàn)效果
使用Form組件時(shí)
在使用Form組件時(shí),我們通常需要定義Form類。
這個(gè)Form,里面的字段,就可以理解為input標(biāo)簽,只不過是在后端寫的。
Form類
- from django.forms import Form
- class LoginForm(Form):
- uname = fields.CharField(label="用戶名")
- upwd = fields.CharField(label="密碼")
views.py
- from django.shortcuts import render
- def login(request):
- form = LoginForm()
- return render(request, "login_f.html", {"form": form})
html
- ...
- {{ form.uname }}
- {{ form.uname.errors.0 }}
- {{ form.upwd }}
- {{ form.upwd.errors.0 }}
- ...
小總結(jié)
可以發(fā)現(xiàn),我并沒有寫input代碼,而是直接調(diào)用后端的form.<字段名>出來的。
Form類生成的Html
可以發(fā)現(xiàn),基本上和自己寫的Html差不多,生成的id為id+<字段名>。
Form生成的Html和手動(dòng)寫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對象時(shí),傳入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會(huì)把上次輸入框內(nèi)容保存下來,并且還會(huì)展示errors信息
- return render(request, "login_f.html", {"form": form})
4.前端使用后端傳過來的form對象。
方式一,點(diǎn)每個(gè)字段
- {{ form.uname }}
- {{ form.uname.errors.0 }}
- {{ form.upwd }}
- {{ form.upwd.errors.0 }}
方式二,循環(huán)form對象
form對象是可以循環(huán)的,循環(huán)的每個(gè)form對象就是每個(gè)字段對象。
- {% for foo in form %}
- {{ foo }}
- {{ foo.errors.0 }}
- {% endfor %}
所以,如果一個(gè)表有很多的字段時(shí),盡可能的采用循環(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,錯(cuò)誤信息{"required":"不能為空",...}
- show_hidden_initial=False,是否在當(dāng)前插件后再加一個(gè)隱藏且具有默認(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 ModelMultipleChoiceField
- ModelMultipleChoiceField(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)
- CheckboxInput
- Select
- NullBooleanSelect
- SelectMultiple
- RadioSelect
- CheckboxSelectMultiple
- FileInput
- ClearableFileInput
- MultipleHiddenInput
- SplitDateTimeWidget
- SplitHiddenDateTimeWidget
- SelectDateWidget
widget示例
- from django.forms import fields, widgets
- from django.forms import Form
- user = fields.CharField(
- initial=2,
- widget=widgets.RadioSelect(choices=((1,'一班'),(2,'二班'),))
- )
- # or
- user = 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 Form
- from django.core.validators import RegexValidator
- class 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_model
- class Form類(Form):
- depart = form_model.ModelMultipleChoiceField(queryset=models.Depart.objects.all())
總結(jié)
本篇先從入門角度說如何使用簡單使用Django Form組件,使用Form組件和沒使用Form組件的區(qū)別。
然后講了以下Form如何使用。
- 首先GET請求時(shí),返回頁面。
- POST請求時(shí),驗(yàn)證數(shù)據(jù),判斷是否符合規(guī)則。
- 如果失敗返回錯(cuò)誤信息,如果成功繼續(xù),寫入數(shù)據(jù)庫。
最后列舉出常用的Form字段,還有如何使用多選字段。
本文名稱:一篇文章淺析DjangoForm組件相關(guān)知識
文章地址:http://www.dlmjj.cn/article/djcjeod.html


咨詢
建站咨詢
