鈎子函數(hook)的使用


在源碼中:

form_obj.is_valid()都干了什么?


1.self._errors = ErrorDict() --> {}
2.self.cleaned_data = {}

3.self.fields.items()
字段名 字段對象
4.如果有錯誤:
self._errors["name"] = ""

5.沒有報錯:
self.cleaned_data["name"] = value(用戶填寫的值)

一 簡介 我們來聊聊如何構建forms的鈎子
二 目的 實現自定義的驗證機制,從而進行處理
三 分類:
    1 局部鈎子 clean_column() 當字段校驗完畢后,再進行查找是否有以clean_開頭的函數名,如果有,就調用該函數
    2 全局鈎子 clean() 其原理是對校驗完畢的字段,再進行字段間的校驗。當字段校驗完畢,查找是否有clean的函數,如果有就運行該函數 
    執行順序 局部鈎子 全局鈎子

  

from django.core.exceptions import ValidationError
# 定義局部鈎子,用來校驗name字段
    def clean_name(self):
        name = self.cleaned_data.get("name", None)
        value = models.UserInfo.objects.filter().values_list("name")
        if name in value:
            raise ValidationError("此名字已經被注冊!")
        else:
            return name

    # 定義全局鈎子,用來檢驗密碼和確認密碼字段是否一致
    # 重寫父類的clean方法
    def clean(self):
        # 此時 通過校驗的字段的數據都保存在 self.clean_data
        pwd = self.cleaned_data.get("pwd")
        re_pwd = self.cleaned_data.get("re_pwd")
        if pwd == re_pwd:
            return self.cleaned_data
        else:
            self.add_error("re_pwd", ValidationError("兩次的密碼不一致!"))
            raise ValidationError("兩次密碼不一致!")

注意
   1 單個字段只能指定單個方法
   2 鈎子是按照順序執行的,如果上面的不過,直接拋出異常了.不會執行下面的鈎子
   3 clean()的優先級最高

小補充~~~~~

    1.對於多余的字段不存入庫,可以采用字典刪除的方式入庫

     forms.cleaned_data.pop("column")

     models.object.create(** forms.cleaned_data)

 2. 重新父類init 方法

  

# 重寫父類的init方法
    def __init__(self, *args, **kwargs):
        # 1. 批量添加樣式
        super().__init__(*args, **kwargs)
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
            })
        # 2.form對象是一個可迭代的對象
        # choices的數據如果從數據庫獲取可能會造成數據無法實時更新
        # 通過構造方法,在構造中重新獲取數據庫中的值
        self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM