成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章淺析Django Form組件相關(guān)知識

開發(fā) 前端
本篇先從入門角度說如何使用簡單使用Django Form組件,使用Form組件和沒使用Form組件的區(qū)別。

[[375799]]

前言

在上一篇時,我們小試牛刀了以下Django Form組件的使用,一篇文章帶你了解Django Form組件(入門篇),沒來得及的小伙伴可以一起看看。但是你可能會有很多疑問,并不知道怎么使用。

并且知道Form組件的功能。

  • 生成HTML標(biāo)簽。
  • 驗證提交的數(shù)據(jù)。
  • 保留提交之前的數(shù)據(jù)。

所以本篇就接著上次的繼續(xù),來一起學(xué)習(xí)以下Django Form組件如何使用。

Form組件的理解

沒有使用Form組件時

在一般情況下,我們?nèi)绻帉戄斎肟驎r,在Html中,一般都是這樣寫的。

代碼

  1. ... 
  2. <form method="post" action="" novalidate> 
  3.     <div> 
  4.         <label>用戶名:</label> 
  5.         <input type="text" name="uname"
  6.     </div> 
  7.     <div> 
  8.         <label>密碼:</label> 
  9.         <input type="text" name="upwd"
  10.     </div> 
  11.     <div><input type="submit"></div> 
  12. </form> 
  13. ... 

 實現(xiàn)效果


使用Form組件時

在使用Form組件時,我們通常需要定義Form類。

這個Form,里面的字段,就可以理解為input標(biāo)簽,只不過是在后端寫的。

Form類

  1. from django.forms import Form 
  2. class LoginForm(Form): 
  3.     uname = fields.CharField(label="用戶名"
  4.     upwd = fields.CharField(label="密碼"

views.py

  1. from django.shortcuts import render 
  2. def login(request): 
  3.     form = LoginForm() 
  4.     return render(request, "login_f.html", {"form": form}) 

html

  1. ... 
  2. <form method="post" action="" novalidate> 
  3.     <div> 
  4.         <label>{{ form.uname.label }}:</label> 
  5.         {{ form.uname }} 
  6.         <!--  
  7.             form.uname.errors.0 是為了展示填寫不正確的錯誤信息 
  8.             errors.0是因為錯誤可能有多個 
  9.             但是通常情況下,取第一個錯誤足夠 
  10.          --> 
  11.         {{ form.uname.errors.0 }} 
  12.     </div> 
  13.     <div> 
  14.         <label>{{ form.upwd.label }}:</label> 
  15.         {{ form.upwd }} 
  16.         {{ form.upwd.errors.0 }} 
  17.     </div> 
  18.     <div><input type="submit"></div> 
  19. </form> 
  20. ... 

 小總結(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對上。

  1. class LoginForm(Form): 
  2.     uname = fields.CharField(label="用戶名"
  3.     upwd = fields.CharField(label="密碼"

因為Form提交的數(shù)據(jù),可以轉(zhuǎn)換成dict,key就是Form字段名。

如果Form字段和models對上,直接models.<模型類>.objects.create(**dict)。

2.如果是GET請求,實例化Form對象,并且返回頁面。

  1. def login(request): 
  2.     if request.method == 'GET'
  3.         form = LoginForm() 
  4.         return render(request, "login_f.html", {"form": form}) 

3.如果是POST請求,實例化Form對象時,傳入request.POST,request.FILES,并且驗證。

  1. # 接著上面 
  2.     elif request.method == "POST"
  3.         form = LoginForm(request.POST, request.FILES) 
  4.         ########### 驗證數(shù)據(jù) 
  5.         if form.is_valid(): 
  6.             # 驗證成功 
  7.             # 驗證成功之后的數(shù)據(jù),key就是Form類的字段名 
  8.             print(form.cleaned_data)  # {'uname''1212''upwd''1212'
  9.             return HttpResponse("ok"
  10.         # 驗證失敗 
  11.         # 雖然返回的還是頁面 
  12.         # 但是form會把上次輸入框內(nèi)容保存下來,并且還會展示errors信息 
  13.         return render(request, "login_f.html", {"form": form}) 

4.前端使用后端傳過來的form對象。

方式一,點每個字段

  1. <form method="post" action="" novalidate> 
  2.     <div> 
  3.         <!-- form.uname.label點的是label屬性  --> 
  4.         <label>{{ form.uname.label }}:</label> 
  5.         {{ form.uname }} 
  6.         <!-- 
  7.             form.uname.errors.0 是為了展示填寫不正確的錯誤信息 
  8.             errors.0是因為錯誤可能有多個 
  9.             但是通常情況下,取第一個錯誤足夠 
  10.          --> 
  11.         {{ form.uname.errors.0 }} 
  12.     </div> 
  13.     <div> 
  14.         <label>{{ form.upwd.label }}:</label> 
  15.         {{ form.upwd }} 
  16.         {{ form.upwd.errors.0 }} 
  17.     </div> 
  18.     <div><input type="submit"></div> 
  19. </form> 

 方式二,循環(huán)form對象

form對象是可以循環(huán)的,循環(huán)的每個form對象就是每個字段對象。

  1. <form method="post" action="" novalidate> 
  2.     {% for foo in form %} 
  3.         <div> 
  4.             <label>{{ foo.label }}:</label> 
  5.             {{ foo }} 
  6.             {{ foo.errors.0 }} 
  7.         </div> 
  8.     {% endfor %} 
  9.     <div><input type="submit"></div> 
  10. </form> 
 所以,如果一個表有很多的字段時,盡可能的采用循環(huán)方式。

Form字段

Form組件主要是幫助我們做驗證的,所以,當(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)值的插件(可用于驗證兩次輸入是否一致)
  • validators=[],自定義驗證規(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ù)位長度

其他字段還有

  1. BaseTemporalField(Field) 
  2. DateField(BaseTemporalField) 
  3. TimeField(BaseTemporalField) 
  4. DateTimeField(BaseTemporalField) 
  5. DurationField(Field) 
  6. RegexField(CharField) 
  7. EmailField(CharField) 
  8. FileField(Field) 
  9. ImageField(FileField) 
  10. URLField(Field) 
  11. BooleanField(Field) 
  12. NullBooleanField(BooleanField) 

...還有很多字段,這里就不一一贅述了,具體詳見官網(wǎng):

https://docs.djangoproject.com/zh-hans/2.0/ref/forms/api/#django.forms.BoundField

多選字段

  1. ChoiceField(Field) 
  2. ... 
  3.     choices=() # 選項,如:choices = ((1,'一班'),(2,'二班'),) 
  4.     required=True # 是否必填 
  5.     widget=None # 插件,默認(rèn)select插件 
  6.     label=None # Label內(nèi)容 
  7.     initial=None # 初始值 
  8.     help_text='' # 幫助提示 
  9.  
  10. from django.forms.models import ModelChoiceField 
  11. # 單選 
  12. ModelChoiceField(ChoiceField) 
  13.     queryset=None # 查詢數(shù)據(jù)庫中的數(shù)據(jù) 
  14.     empty_label="---------" # 默認(rèn)空顯示內(nèi)容 
  15.     to_field_name=None # HTML中value的值對應(yīng)的字段 
  16.     limit_choices_to=None # ModelForm中對queryset二次篩選 
  17. # 多選 
  18. from django.forms.models import ModelMultipleChoiceField 
  19. ModelMultipleChoiceField(ModelChoiceField) 
  20. ... 

widget參數(shù)對應(yīng)的插件

即使字段是CharField,但是最終效果以插件為主!

  1. TextInput(Input) 
  2. NumberInput(TextInput) 
  3. EmailInput(TextInput) 
  4. URLInput(TextInput) 
  5. PasswordInput(TextInput) 
  6. HiddenInput(TextInput) 
  7. Textarea(Widget) 
  8. DateInput(DateTimeBaseInput) 
  9. DateTimeInput(DateTimeBaseInput) 
  10. TimeInput(DateTimeBaseInput) 
  11. CheckboxInput 
  12. Select 
  13. NullBooleanSelect 
  14. SelectMultiple 
  15. RadioSelect 
  16. CheckboxSelectMultiple 
  17. FileInput 
  18. ClearableFileInput 
  19. MultipleHiddenInput 
  20. SplitDateTimeWidget 
  21. SplitHiddenDateTimeWidget 
  22. SelectDateWidget 

widget示例

  1. from django.forms import fields, widgets 
  2. from django.forms import Form 
  3. user = fields.CharField( 
  4.     initial=2, 
  5.     widget=widgets.RadioSelect(choices=((1,'一班'),(2,'二班'),)) 
  6. or 
  7. user = fields.ChoiceField( 
  8.     choices=((1,'一班'),(2,'二班'),), 
  9.     initial=2, 
  10.     widget=widgets.RadioSelect 
  11. # 多選select,值為列表 
  12. user = fields.MultipleChoiceField( 
  13.     choices=((1,'一班'),(2,'二班'),), 
  14.     initial=[1,], 
  15.     widget=widgets.SelectMultiple 
  16. # 從數(shù)據(jù)庫中獲取多選 
  17. # 方式一 
  18. from django.forms import Form 
  19. from django.core.validators import RegexValidator 
  20.   
  21. class Form類(Form): 
  22.   
  23.     user = fields.ChoiceField( 
  24.         # choices=((1,'一班'),(2,'二班'),), 
  25.         initial=2, 
  26.         widget=widgets.Select 
  27.     ) 
  28.   
  29.     def __init__(self, *args, **kwargs): 
  30.         super(MyForm,self).__init__(*args, **kwargs) 
  31.         # self.fields['user'].widget.choices = ((1,'一班'),(2,'二班'),) 
  32.         # 或 
  33.         self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption'
  34. # 方式二 
  35. from django.forms import models as form_model 
  36. class Form類(Form): 
  37.     depart = form_model.ModelMultipleChoiceField(queryset=models.Depart.objects.all()) 

總結(jié)

本篇先從入門角度說如何使用簡單使用Django Form組件,使用Form組件和沒使用Form組件的區(qū)別。

然后講了以下Form如何使用。

  • 首先GET請求時,返回頁面。
  • POST請求時,驗證數(shù)據(jù),判斷是否符合規(guī)則。
  • 如果失敗返回錯誤信息,如果成功繼續(xù),寫入數(shù)據(jù)庫。

最后列舉出常用的Form字段,還有如何使用多選字段。

 

責(zé)任編輯:姜華 來源: Python爬蟲與數(shù)據(jù)挖掘
相關(guān)推薦

2021-01-12 09:04:12

Django FormForm組件開發(fā)

2021-05-20 09:02:59

CSS單位長度

2021-01-05 09:07:30

Django ORMF查詢Q查詢

2020-12-29 09:05:48

基礎(chǔ)DjangoORM

2021-04-07 06:11:37

Css前端CSS定位知識

2021-07-13 11:37:47

cpu架構(gòu)Linux

2021-01-07 11:10:47

關(guān)鍵字

2020-10-09 08:15:11

JsBridge

2021-01-01 09:20:20

操作DjangoORM

2021-03-21 07:36:43

Python迭代知識語言

2022-02-21 09:44:45

Git開源分布式

2023-05-12 08:19:12

Netty程序框架

2019-04-17 15:16:00

Sparkshuffle算法

2021-04-09 08:40:51

網(wǎng)絡(luò)保險網(wǎng)絡(luò)安全網(wǎng)絡(luò)風(fēng)險

2021-06-30 00:20:12

Hangfire.NET平臺

2024-06-25 08:18:55

2017-09-05 08:52:37

Git程序員命令

2021-06-30 10:01:09

Python字典代碼

2019-05-21 14:52:57

2024-12-26 16:49:20

Python字典元素
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91麻豆精品国产91久久久更新资源速度超快 | 精品一区二区在线视频 | 亚洲逼院| 国产欧美日韩视频 | 亚洲成人自拍网 | 亚洲午夜网 | 日韩亚洲视频 | 日韩av成人在线 | 成人性视频免费网站 | 免费在线观看成人av | 国产精品久久久久久久 | 黄色大片免费播放 | 一级毛片成人免费看a | 久久久久久综合 | 日本亚洲一区 | 国产一级免费视频 | 91精品国产91久久久久福利 | 国产高清在线精品 | 国产精品毛片无码 | 日韩精品亚洲专区在线观看 | 国产成人一区二区三区精 | 国产精品久久久久久久久久久久午夜片 | 一区二区在线观看免费视频 | 欧美日韩国产一区 | 天堂成人国产精品一区 | 欧美一区二区二区 | 91在线资源 | 亚洲成人午夜电影 | 中文一区| 亚av在线 | 激情在线视频网站 | 欧美国产日韩一区二区三区 | 中文视频在线 | 欧美一级在线 | 综合国产 | 成人小视频在线观看 | 欧美久久久久久 | 在线一区二区三区 | 精品国产乱码久久久久久88av | 国产日韩视频 | 欧美一区二区在线观看 |