<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 6193字,需瀏覽 13分鐘

           ·

          2021-01-15 20:26

          擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(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 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_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)個【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 59
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线播放神尾舞视频 | 国产精品扒开腿做爽爽爽A片唱戏 | 伊人大香蕉精品 | 婷婷午夜 | 男人的天堂在线视频 |