您好,登錄后才能下訂單哦!
這篇文章主要介紹“Django Form組件相關知識有哪些”,在日常操作中,相信很多人在Django Form組件相關知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Django Form組件相關知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Form組件的理解
沒有使用Form組件時
在一般情況下,我們如果編寫輸入框時,在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> ...
實現效果
使用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> ...
小總結
可以發現,我并沒有寫input代碼,而是直接調用后端的form.<字段名>出來的。
Form類生成的Html
可以發現,基本上和自己寫的Html差不多,生成的id為id+<字段名>。
Form生成的Html和手動寫Html對應圖
通過對應圖確定,通過后端的form.<字段>生成的直接就是input標簽。
好了,到這,就確定了Form類,就是為我們生成input標簽的。
Form使用
使用有以下步驟。
1.創建Form類,盡可能和models對上。
class LoginForm(Form): uname = fields.CharField(label="用戶名") upwd = fields.CharField(label="密碼")
因為Form提交的數據,可以轉換成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) ########### 驗證數據 if form.is_valid(): # 驗證成功 # 驗證成功之后的數據,key就是Form類的字段名 print(form.cleaned_data) # {'uname': '1212', 'upwd': '1212'} return HttpResponse("ok") # 驗證失敗 # 雖然返回的還是頁面 # 但是form會把上次輸入框內容保存下來,并且還會展示errors信息 return render(request, "login_f.html", {"form": form})
4.前端使用后端傳過來的form對象。
方式一,點每個字段
方式二,循環form對象
form對象是可以循環的,循環的每個form對象就是每個字段對象。
Form字段
Form組件主要是幫助我們做驗證的,所以,當然有很多參數比如:
否可以為空。
label展示的內容。
等...
常用字段
Field類為所有字段的基類
Field參數如下
required=True,是否允許為空,默認True,不能為空
widget=None,插件,展示的input具體信息
label=None,label,標簽展示的內容
help_text="",幫助信息(在標簽旁邊顯示)
error_massages=None,錯誤信息{"required":"不能為空",...}
show_hidden_initial=False,是否在當前插件后再加一個隱藏且具有默認值的插件(可用于驗證兩次輸入是否一致)
validators=[],自定義驗證規則函數
localize=False,是否支持本地化
disabled=False,是否可以編輯
label_suffix=None,Label內容后綴
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,小數位長度
其他字段還有
BaseTemporalField(Field) DateField(BaseTemporalField) TimeField(BaseTemporalField) DateTimeField(BaseTemporalField) DurationField(Field) RegexField(CharField) EmailField(CharField) FileField(Field) ImageField(FileField) URLField(Field) BooleanField(Field) NullBooleanField(BooleanField)
...還有很多字段,這里就不一一贅述了,具體詳見官網:
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內容 initial=None # 初始值 help_text='' # 幫助提示 from django.forms.models import ModelChoiceField # 單選 ModelChoiceField(ChoiceField) queryset=None # 查詢數據庫中的數據 empty_label="---------" # 默認空顯示內容 to_field_name=None # HTML中value的值對應的字段 limit_choices_to=None # ModelForm中對queryset二次篩選 # 多選 from django.forms.models import ModelMultipleChoiceField ModelMultipleChoiceField(ModelChoiceField) ...
widget參數對應的插件
即使字段是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 ) # 從數據庫中獲取多選 # 方式一 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())
到此,關于“Django Form組件相關知識有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。