溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Django Form組件相關(guān)知識有哪些

發(fā)布時間:2021-10-20 11:51:45 來源:億速云 閱讀:147 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“Django Form組件相關(guān)知識有哪些”,在日常操作中,相信很多人在Django Form組件相關(guān)知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Django Form組件相關(guān)知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

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> ...

實現(xiàn)效果

Django Form組件相關(guān)知識有哪些

使用Form組件時

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

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

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 method="post" action="" novalidate>     <div>         <label>{{ form.uname.label }}:</label>         {{ form.uname }}         <!--              form.uname.errors.0 是為了展示填寫不正確的錯誤信息             errors.0是因為錯誤可能有多個             但是通常情況下,取第一個錯誤足夠          -->         {{ 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

Django Form組件相關(guān)知識有哪些

可以發(fā)現(xiàn),基本上和自己寫的Html差不多,生成的id為id+<字段名>。

Form生成的Html和手動寫Html對應(yīng)圖

Django Form組件相關(guān)知識有哪些

通過對應(yīng)圖確定,通過后端的form.<字段>生成的直接就是input標簽。

好了,到這,就確定了Form類,就是為我們生成input標簽的。

Form使用

使用有以下步驟。

1.創(chuàng)建Form類,盡可能和models對上。

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

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

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

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

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

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

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

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

方式一,點每個字段

<form method="post" action="" novalidate>     <div>         <!-- form.uname.label點的是label屬性  -->         <label>{{ form.uname.label }}:</label>         {{ form.uname }}         <!--             form.uname.errors.0 是為了展示填寫不正確的錯誤信息             errors.0是因為錯誤可能有多個             但是通常情況下,取第一個錯誤足夠          -->         {{ 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組件主要是幫助我們做驗證的,所以,當然有很多參數(shù)比如:

  • 否可以為空。

  • label展示的內(nèi)容。

  • 等...

常用字段

Field類為所有字段的基類

Field參數(shù)如下

  • required=True,是否允許為空,默認True,不能為空

  • widget=None,插件,展示的input具體信息

  • label=None,label,標簽展示的內(nèi)容

  • help_text="",幫助信息(在標簽旁邊顯示)

  • error_massages=None,錯誤信息{"required":"不能為空",...}

  • show_hidden_initial=False,是否在當前插件后再加一個隱藏且具有默認值的插件(可用于驗證兩次輸入是否一致)

  • 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ù)位長度

其他字段還有

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=() # 選項,如:choices = ((1,'一班'),(2,'二班'),)     required=True # 是否必填     widget=None # 插件,默認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="---------" # 默認空顯示內(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())

到此,關(guān)于“Django Form組件相關(guān)知識有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI