国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django中的forms組件實例詳解

2020-01-04 14:06:45
字體:
供稿:網(wǎng)友

Form介紹

我們之前在HTML頁面中利用form表單向后端提交數(shù)據(jù)時,都會寫一些獲取用戶輸入的標(biāo)簽并且用form標(biāo)簽把它們包起來。

與此同時我們在好多場景下都需要對用戶的輸入做校驗,比如校驗用戶是否輸入,輸入的長度和格式等正不正確。如果用戶輸入的內(nèi)容有錯誤就需要在頁面上相應(yīng)的位置顯示對應(yīng)的錯誤信息.。

Django form組件就實現(xiàn)了上面所述的功能。

總結(jié)一下,其實form組件的主要功能如下:

  • 生成頁面可用的HTML標(biāo)簽
  • 對用戶提交的數(shù)據(jù)進(jìn)行校驗
  • 保留上次輸入內(nèi)容

先在應(yīng)用目錄下my_forms.py定義好一個UserForm類

from django import forms from django.forms import widgets    class UserForm(forms.Form):     username = forms.CharField(min_length=4, label='用戶名',                   widget=widgets.TextInput(attrs={"class": "form-control"}),                   error_messages={                     "required": "用戶名不能為空",                   })     pwd = forms.CharField(min_length=4, label='密碼',                error_messages={                  "required": "密碼不能為空",                },                widget=widgets.PasswordInput(attrs={"class": "form-control"}))     r_pwd = forms.CharField(min_length=4, label='確認(rèn)密碼',                 widget=widgets.PasswordInput(attrs={"class": "form-control"}),                 error_messages={                   "required": "密碼不能為空",                 })     email = forms.EmailField(label='郵箱',                 widget=widgets.EmailInput(attrs={"class": "form-control"}),                 error_messages={                   "required": '郵箱不能為空',                   "invalid": "郵箱格式錯誤",                 })     tel = forms.CharField(label='手機(jī)號',                widget=widgets.TextInput(attrs={"class": "form-control"}),                )

再寫一個視圖函數(shù):

  在寫一個視圖函數(shù)

   def reg(request):     form = UserForm()     if request.method == "POST":       print(request.POST)       # 實例化form對象的時候,把post提交過來的數(shù)據(jù)直接傳進(jìn)去       form = UserForm(request.POST) # form表單的name屬性值應(yīng)該與forms組件的字段名稱一致       if form.is_valid():         print(form.cleaned_data)         return HttpResponse('注冊成功')     return render(request, 'reg.html', locals())

login.html

  <!DOCTYPE html>   <html lang="zh_CN">   <head>     <meta charset="UTF-8">     <meta http-equiv="x-ua-compatible" content="IE=edge">     <meta name="viewport" content="width=device-width, initial-scale=1">     <title>注冊</title>   </head>   <body>   <h3>傳統(tǒng)form表單</h3>   <form action="" method="post">     {% csrf_token %}     <p>用戶名:<input type="text" name="username"></p>     <p>密碼:<input type="password" name="pwd"></p>     <p>確認(rèn)密碼:<input type="password" name="r_pwd"></p>     <p>郵箱:<input type="email" name="email"></p>     <p>手機(jī)號:<input type="tel" name="tel"></p>     <p><input type="submit" value="提交"></p>   </form>   <h3>forms組件渲染方式1</h3>   <form action="" method="post" novalidate>     {% csrf_token %}     <p>{{ form.username.label }}:{{ form.username }} <span>{{ form.username.errors.0 }}</span></p>     <p>密碼:{{ form.pwd }}       <span>{{ form.pwd.errors.0 }}</span></p>     <p>確認(rèn)密碼:{{ form.r_pwd }}       <span>{{ form.r_pwd.errors.0 }}</span></p>     <p>郵箱:{{ form.email }}       <span>{{ form.email.errors.0 }}</span></p>     <p>手機(jī)號:{{ form.tel }}       <span>{{ form.tel.errors.0 }}</span></p>     <p><input type="submit" value="提交"></p>   </form>   <h3>forms組件渲染標(biāo)簽方式2</h3>     <form action="" method="post" novalidate>       {% csrf_token %}       {% for field in form %}         <div class="form-group clearfix">           <label for="">{{ field.label }}</label>           {{ field }}           <span style="color: red" class="pull-right">{{ field.errors.0 }}</span>           {% if field.name == 'r_pwd' %}             <span style="color: red" class="pull-right">{{ errors.0 }}</span>           {% endif %}         </div>       {% endfor %}       <input type="submit" value="注冊" class="btn btn-default pull-right">     </form>   <h3>forms組件渲染標(biāo)簽方式3  不推薦使用</h3>   <form action="" method="post">     {% csrf_token %}     {{ form.as_p }}     <input type="submit" value="注冊">   </form>   </body>   </html>

看網(wǎng)頁效果發(fā)現(xiàn) 也驗證了form的功能:

• 前端頁面是form類的對象生成的                                      -->生成HTML標(biāo)簽功能

• 當(dāng)用戶名和密碼輸入為空或輸錯之后 頁面都會提示        -->用戶提交校驗功能

• 當(dāng)用戶輸錯之后 再次輸入 上次的內(nèi)容還保留在input框   -->保留上次輸入內(nèi)容

Form那些事兒

常用字段與插件

創(chuàng)建Form類時,主要涉及到 【字段】 和 【插件】,字段用于對用戶請求數(shù)據(jù)的驗證,插件用于自動生成HTML;

initial

初始值,input框里面的初始值。

class LoginForm(forms.Form):  username = forms.CharField(    min_length=8,    label="用戶名",    initial="張三" # 設(shè)置默認(rèn)值  )  pwd = forms.CharField(min_length=6, label="密碼")

error_messages

重寫錯誤信息。

class LoginForm(forms.Form):  username = forms.CharField(    min_length=8,    label="用戶名",    initial="張三",    error_messages={      "required": "不能為空",      "invalid": "格式錯誤",      "min_length": "用戶名最短8位"    }  )  pwd = forms.CharField(min_length=6, label="密碼")

password

class LoginForm(forms.Form):  ...  pwd = forms.CharField(    min_length=6,    label="密碼",    widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)  )

radioSelect

單radio值為字符串

class LoginForm(forms.Form):  username = forms.CharField(    min_length=8,    label="用戶名",    initial="張三",    error_messages={      "required": "不能為空",      "invalid": "格式錯誤",      "min_length": "用戶名最短8位"    }  )  pwd = forms.CharField(min_length=6, label="密碼")  gender = forms.fields.ChoiceField(    choices=((1, "男"), (2, "女"), (3, "保密")),    label="性別",    initial=3,    widget=forms.widgets.RadioSelect()  )

單選Select

class LoginForm(forms.Form):  ...  hobby = forms.fields.ChoiceField(    choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ),    label="愛好",    initial=3,    widget=forms.widgets.Select()  )

 

多選Select

class LoginForm(forms.Form):  ...  hobby = forms.fields.MultipleChoiceField(    choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ),    label="愛好",    initial=[1, 3],    widget=forms.widgets.SelectMultiple()  )

 

單選checkbox

class LoginForm(forms.Form):  ...  keep = forms.fields.ChoiceField(    label="是否記住密碼",    initial="checked",    widget=forms.widgets.CheckboxInput()  )

 

多選checkbox

class LoginForm(forms.Form):  ...  hobby = forms.fields.MultipleChoiceField(    choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),    label="愛好",    initial=[1, 3],    widget=forms.widgets.CheckboxSelectMultiple()  )

 

關(guān)于choice的注意事項:

在使用選擇標(biāo)簽時,需要注意choices的選項可以從數(shù)據(jù)庫中獲取,但是由于是靜態(tài)字段 ***獲取的值無法實時更新***,那么需要自定義構(gòu)造方法從而達(dá)到此目的。

方式一:

from django.forms import Formfrom django.forms import widgetsfrom django.forms import fields class MyForm(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'].choices = ((1, '上海'), (2, '北京'),)    # 或    self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')

方式二:

from django import formsfrom django.forms import fieldsfrom django.forms import models as form_modelclass FInfo(forms.Form):  authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # 多選  # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all()) # 單選Django Form所有內(nèi)置字段Field  required=True,        是否允許為空  widget=None,         HTML插件  label=None,         用于生成Label標(biāo)簽或顯示內(nèi)容  initial=None,        初始值  help_text='',        幫助信息(在標(biāo)簽旁邊顯示)  error_messages=None,     錯誤信息 {'required': '不能為空', 'invalid': '格式錯誤'}  validators=[],        自定義驗證規(guī)則  localize=False,       是否支持本地化  disabled=False,       是否可以編輯  label_suffix=None      Label內(nèi)容后綴CharField(Field)  max_length=None,       最大長度  min_length=None,       最小長度  strip=True          是否移除用戶輸入空白IntegerField(Field)  max_value=None,       最大值  min_value=None,       最小值FloatField(IntegerField)  ...DecimalField(IntegerField)  max_value=None,       最大值  min_value=None,       最小值  max_digits=None,       總長度  decimal_places=None,     小數(shù)位長度BaseTemporalField(Field)  input_formats=None     時間格式化  DateField(BaseTemporalField)  格式:2015-09-01TimeField(BaseTemporalField)  格式:11:12DateTimeField(BaseTemporalField)格式:2015-09-01 11:12DurationField(Field)      時間間隔:%d %H:%M:%S.%f  ...RegexField(CharField)  regex,           自定制正則表達(dá)式  max_length=None,      最大長度  min_length=None,      最小長度  error_message=None,     忽略,錯誤信息使用 error_messages={'invalid': '...'}EmailField(CharField)     ...FileField(Field)  allow_empty_file=False   是否允許空文件ImageField(FileField)     ...  注:需要PIL模塊,pip3 install Pillow  以上兩個字典使用時,需要注意兩點:    - form表單中 enctype="multipart/form-data"    - view函數(shù)中 obj = MyForm(request.POST, request.FILES)URLField(Field)  ...BooleanField(Field)   ...NullBooleanField(BooleanField)  ...ChoiceField(Field)  ...  choices=(),        選項,如:choices = ((0,'上海'),(1,'北京'),)  required=True,       是否必填  widget=None,        插件,默認(rèn)select插件  label=None,        Label內(nèi)容  initial=None,       初始值  help_text='',       幫助提示ModelChoiceField(ChoiceField)  ...            django.forms.models.ModelChoiceField  queryset,         # 查詢數(shù)據(jù)庫中的數(shù)據(jù)  empty_label="---------",  # 默認(rèn)空顯示內(nèi)容  to_field_name=None,    # HTML中value的值對應(yīng)的字段  limit_choices_to=None   # ModelForm中對queryset二次篩選ModelMultipleChoiceField(ModelChoiceField)  ...            django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)  coerce = lambda val: val  對選中的值進(jìn)行一次轉(zhuǎn)換  empty_value= ''      空值的默認(rèn)值MultipleChoiceField(ChoiceField)  ...TypedMultipleChoiceField(MultipleChoiceField)  coerce = lambda val: val  對選中的每一個值進(jìn)行一次轉(zhuǎn)換  empty_value= ''      空值的默認(rèn)值ComboField(Field)  fields=()         使用多個驗證,如下:即驗證最大長度20,又驗證郵箱格式                fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])MultiValueField(Field)  PS: 抽象類,子類中可以實現(xiàn)聚合多個字典去匹配一個值,要配合MultiWidget使用SplitDateTimeField(MultiValueField)  input_date_formats=None,  格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']  input_time_formats=None  格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']FilePathField(ChoiceField)   文件選項,目錄下文件顯示在頁面中  path,           文件夾路徑  match=None,        正則匹配  recursive=False,      遞歸下面的文件夾  allow_files=True,     允許文件  allow_folders=False,    允許文件夾  required=True,  widget=None,  label=None,  initial=None,  help_text=''GenericIPAddressField  protocol='both',      both,ipv4,ipv6支持的IP格式  unpack_ipv4=False     解析ipv4地址,如果是::ffff:192.0.2.1時候,可解析為192.0.2.1, PS:protocol必須為both才能啟用SlugField(CharField)      數(shù)字,字母,下劃線,減號(連字符)  ...UUIDField(CharField)      uuid類型

 

Django Form內(nèi)置字段

校驗

方式一:

from django.forms import Formfrom django.forms import widgetsfrom django.forms import fieldsfrom django.core.validators import RegexValidatorclass MyForm(Form):  user = fields.CharField(    validators=[RegexValidator(r'^[0-9]+$', '請輸入數(shù)字'), RegexValidator(r'^159[0-9]+$', '數(shù)字必須以159開頭')],  )

 

方式二:

 

import refrom django.forms import Formfrom django.forms import widgetsfrom django.forms import fieldsfrom django.core.exceptions import ValidationError# 自定義驗證規(guī)則def mobile_validate(value):  mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')  if not mobile_re.match(value):    raise ValidationError('手機(jī)號碼格式錯誤')class PublishForm(Form):              min_length=5,              error_messages={'required': '標(biāo)題不能為空',                      'min_length': '標(biāo)題最少為5個字符',                      'max_length': '標(biāo)題最多為20個字符'},              widget=widgets.TextInput(attrs={'class': "form-control",                             'placeholder': '標(biāo)題5-20個字符'}))  # 使用自定義驗證規(guī)則  phone = fields.CharField(validators=[mobile_validate, ],              error_messages={'required': '手機(jī)不能為空'},              widget=widgets.TextInput(attrs={'class': "form-control",                             'placeholder': u'手機(jī)號碼'}))  email = fields.EmailField(required=False,              error_messages={'required': u'郵箱不能為空','invalid': u'郵箱格式錯誤'},              widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'郵箱'}))

方式三:

 def clean(self):     pwd = self.cleaned_data.get('pwd')     r_pwd = self.cleaned_data.get('r_pwd')     print(pwd, r_pwd)     if pwd and r_pwd:       if pwd == r_pwd:         return self.cleaned_data       raise ValidationError('兩次密碼不一致')     else:       return self.cleaned_data   def clean_username(self):     val = self.cleaned_data.get('username')     user = UserInfo.objects.filter(name=val)     if not user:       return val     else:       raise ValidationError("用戶名已注冊")   def clean_tel(self):     val = self.cleaned_data.get('tel')     if len(val) == 11:       return val     raise ValidationError('手機(jī)號格式錯誤')

總結(jié):

'''   局部鉤子:     1、is_valid()     2、self.errors     3、self.full_clean()     4、self._clean_fields() 校驗每一個字段    5、for 循環(huán)每一個字段名、驗證規(guī)則對象     6、       驗證通過:         value = field.clean(value)         self.cleaned_data[name] = value       添加到clean_data中         利用反射、鉤子自定義驗證規(guī)則         hasattr(self, 'clean_%s' % name)      寫自定義方法         value = getattr(self, 'clean_%s' % name)() 執(zhí)行自定義方法           pass:             self.cleaned_data[name] = value   添加到clean_data中           no_pass:             raise ValidationError(msg)     拋出異常       不通過:         raise ValidationError(msg)   全局鉤子:     1、is_valid()     2、self.errors     3、self.full_clean()      4、self._clean_form()  全部字段調(diào)用完成之后 調(diào)用     5、self.clean() 重寫clean方法     6、全局鉤子錯誤:forms.errors.get("__all__")   '''

總結(jié)

以上所述是小編給大家介紹的Django中的forms組件實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴宁市| 察隅县| 台前县| 鹤山市| 红安县| 平南县| 确山县| 庆元县| 治多县| 哈尔滨市| 清镇市| 锡林郭勒盟| 治多县| 富顺县| 绥棱县| 万安县| 肥城市| 锡林浩特市| 安泽县| 昌图县| 年辖:市辖区| 宁化县| 海南省| 怀来县| 武隆县| 红安县| 简阳市| 静乐县| 渝中区| 隆尧县| 兰溪市| 泗阳县| 固始县| 无为县| 湘阴县| 文昌市| 永德县| 丹阳市| 隆回县| 武义县| 安义县|