forms組件

 一. each的三種使用方法

方式一html

1 var arr=[12,45,78];
2 $.each(arr,function(i,j){
3         console.log(i,j)
4 })

結果:前端

方式二python

結果:git

方式三數據庫

 

結果:django

 

二. form組件

1.Form組件的使用方法:

(1)在models中建立一張表app

1 class UserInfo(models.Model):
2        name=models.CharField(max_length=32)
3         pwd=models.CharField(max_length=32)
4         email=models.EmailField()

(2)在視圖中建立與之相對應的form組件函數

1 from django import forms
2 class UserForm(forms.Form):
3     name=forms.CharField(max_length=32)
4     pwd=forms.IntegerField()
5     email=forms.EmailField()

(3)執行python.consolepost

    先引入組件:    ui

      from app01.views import UserForm

   再建立一個實例對象:

         form=UserForm({"name":"aaa","pwd":123,"email":"123"})

   判斷輸入的值是否是徹底合法:

         form.is_valid()

   多輸入鍵值對不影響合法性,少,錯鍵值對以及數據不符合規則,都會返回False

       合法的數據存在:

         form.cleaned_data

      以字典的形式: {'name': 'aaa', 'pwd': 123}

       不合法的數據存在:

         form.errors

       以字典的形式存儲錯誤信息:{'email': ['錯誤一',」錯誤二」]}

2.使用form組件的登陸示例

(1)要實現的要求:

    用戶名長度不能低於5位,用戶名不能重複

    密碼不能是純數字

    郵箱必須符合郵箱格式

    錯誤信息提示

(2) forms組件的功能

    校驗數據

    頁面顯示錯誤信息

    渲染頁面和重置數據

(3) 本身寫細節,麻煩

①在models.py文件中:

      class UserInfo(models.Model):
           user=models.CharField(max_length=32)
            pwd=models.CharField(max_length=32)
            email=models.CharField(max_length=32)

 

②在視圖函數中:

 

    ③在前端頁面中

      <form action="" method="post">
              {% csrf_token %}
             用戶名: <input type="text" name="user"> <span class="error">{{ error.user.0 }}</span><br>
             密碼: <input type="password" name="pwd"> <span class="error">{{ error.pwd.0 }}</span> <br>
             郵箱: <input type="text" name="email"> <span class="error">{{ error.email.0 }}</span> <br>
           <input type="submit">
      </form>

 

    ④能實現的效果:

 

  (2) forms組件實現的三種方法

    方法一:

      在視圖函數中直接傳遞實例化的form對象

        form = UserForm()
           return render(request, "reg.html", {"form": form})

      HTML文件中一句話渲染,全部的樣式都來自form組件自帶的

        <form action="" method="post">
                {% csrf_token %}
                 {{ form.as_p }}
                <input type="submit">
        </form>

      前端渲染:

      效果圖

 

    方法二:只渲染一個input輸入框,

      在視圖中:

      在HTML文件中:

        <form action="" method="post" novalidate>#novalidate表示前端不在對信息進行阻攔
                  {% csrf_token %}
                  <p用戶名 {{ form.user }}<span class="error">{{ error.user.0 }}</span> </p>

        #Form對象只渲染一個input框
                 <p>密碼 {{ form.pwd }}<span class="error">{{ error.pwd.0 }}</span></p>
                 <p>郵箱 {{ form.email }}<span class="error">{{ error.email.0 }}</span></p>
                <input type="submit">
        </form>

      效果:可以實現數據重置

    第三種:循環form的每個對象

      在視圖函數中:

 

      在HTML文件中

 

  (5)後期手動調樣式

3.自定義form組建(鉤子的使用)

鉤子的語法:每一份鉤子走到最後要麼是將數據返回,要麼是拋出一個ValidationError錯誤

錯誤須要引入,函數命名時,必定是clean_字段,不然原碼找不到

from django.core.exceptions import NON_FIELD_ERRORS, ValidationError

def clean_user(self):
    val=self.cleaned_data.get("user")
    UserInfo.objects.filter(user=val)
    if not val:
        return val
    else:
        raise ValidationError("用戶名已存在")
def clean_pwd(self):
    val=self.cleaned_data.get("pwd")
    if val.isdigit():
        raise ValidationError("密碼不能是純數字")
    else:
        return val

鉤子效果:

6.鉤子原碼解析

form組件例:

class UserForm(forms.Form):
    user=forms.CharField(min_length=5,
                         label="用戶名",
                         #自定義的label
                         error_messages={"required":"請填寫用戶名"},
                         widget=widgets.TextInput(attrs={"class":"form-control"})
                         )
    pwd=forms.CharField(error_messages={"required":"請填寫密碼"},
                           label="密碼",
                           widget=widgets.PasswordInput(attrs={"class":'form-control'})
                           )
    email=forms.EmailField(error_messages={"required":"請填寫郵箱","invalid":"郵箱格式錯誤"},
                           label="郵箱",
                           widget=widgets.EmailInput(attrs={"class": 'form-control'})
                           )
    def clean_user(self):
        val=self.cleaned_data.get("user")
        UserInfo.objects.filter(user=val)
        if not val:
            return val
        else:
            raise ValidationError("用戶名已存在")
    def clean_pwd(self):
        val=self.cleaned_data.get("pwd")
        if val.isdigit():
            raise ValidationError("密碼不能是純數字")
        else:
            return val

如下幾步到底經歷了哪些 ?

Form=UserForm({「user」:」may」,」pwd」:」123」,」email」:」123」})

Form.is_valid()

Form.clean_data

Form.errors

三. 打散補充

*是打散列表的,**是打散字典的

四.pycharm自帶數據庫的使用

相關文章
相關標籤/搜索