1. 程式人生 > >Django-forms元件

Django-forms元件

一 forms元件

-forms是什麼?
            就是一個類,可以校驗欄位(前臺傳過來的欄位)
        -怎麼用:
        -校驗欄位功能:
            -先寫一個類,繼承Form
            from django.shortcuts import render, HttpResponse
            from django import forms
            # 寫一個類,要校驗那些欄位,就是類的屬性
            class MyForm(forms.Form):
                
# 定義一個屬性,可以用來校驗字串型別 # 限制最大長度是8,最小長度是3 name=forms.CharField(max_length=8,min_length=3) pwd=forms.CharField(max_length=8,min_length=3,required=True) # 校驗是否是郵箱格式 email=forms.EmailField() -使用: #例項化產生物件,傳入要校驗的資料(字典)
myform=MyForm(request.POST) # is_valid如果是true表示校驗成功,反之,校驗失敗 if myform.is_valid(): # 校驗通過的資料 print(myform.cleaned_data) return HttpResponse('校驗成功') else: print
(myform.cleaned_data) #校驗失敗的資訊 print(myform.errors) -注意:校驗的欄位,可以多,但是不能少

二 渲染模板

第一中方式:(靈活性最高)
                <form action="" method="post" >
                    <p>使用者名稱: {{ myform.name }}</p>
                    <p>密碼: {{ myform.pwd }}</p>
                    <p>郵箱: {{ myform.email }}</p>
                    <input type="submit" value="提交">
                </form>
第二種方式:for迴圈form物件(用的比較多):
                <form action="" method="post" >
                    {% for foo in myform %}
                        <p>{{ foo.label }}:{{ foo }}</p>
                    {% endfor %}
                    <input type="submit" value="提交">
                </form>
第三種方式(不建議用):
                <form action="" method="post" >

              {#{{ myform.as_p }}#}
                {{ myform.as_ul }}
                <input type="submit" value="提交">
                </form>

三 渲染錯誤資訊

- myforms有errors
    -屬性(name)也有errors
-錯誤資訊,變成中文:
    - error_messages={'max_length': '最長是8', 'min_length': '最短是3', 'required': '這個必須填','invalid': '不符合郵箱格式'}
-給input標籤指定樣式,指定格式:
    - widget=widgets.TextInput(attrs={'class':'form-control'})
    -模板,渲染錯誤資訊:<span>{{ myform.name.errors.0 }}</span>

四 區域性鉤子與全域性鉤子

-區域性鉤子校驗
    -定義一個函式,名字叫:clean_欄位名字,內部,取出該欄位,進行校驗,如果通過,將該欄位返回,如果失敗,拋異常(ValidationError)
    def clean_name(self):
                # self:當前form物件
        name = self.cleaned_data.get('name')
        if name.startswith('sb'):
                    # 失敗,拋異常
            raise ValidationError('名字不能以傻逼開頭')
        if models.User.objects.filter(name=name).first():
            raise ValidationError('此使用者名稱已被使用')
        return name
-全域性鉤子
#重寫clean方法
    def clean(self):
        #程式能走到該函式,前面校驗已經通過了,所以可以從cleaned_data中取出密碼和確認密碼    
        pwd = self.cleaned_data.get('pwd')
        re_pwd = self.cleaned_data.get('re_pwd')
        #進行自己的校驗
        if pwd == re_pwd:
            #通過,直接返回cleaned_data
            return self.cleaned_data
        else:
            #失敗,拋異常(ValidationError)
            raise ValidationError('兩次密碼不一致')