如果对字段的校验条件太少,不能满足我们的需求,那么,我们可以对每个字段自定义校验的内容,就可以使用局部钩子。
局部钩子的使用方法:
(1)导入错误类型 ————> 我们自己定义的钩子抛出的错误也会被保存到校验失败的错误信息errors中去
from django.core.exceptions import ValidationError ValidationError是用来抛出异常时的错误类型
(2)然后在forms类中创建一个clean_字段名的方法
def clean_字段名(self):
(3)通过cleaned_data获取校验成功的值(对这个字段检验完成后会立即执行它的局部钩子,然后才会继续校验下一个字段)
self.cleaned_data.get("字段名")
(4)例子
from django.contrib import admin from django.urls import path from app01.views import index urlpatterns = [ path('admin/', admin.site.urls), path('index/',index) ]
from django.shortcuts import render,HttpResponse from django import forms from django.core.exceptions import ValidationError #校验错误 class UserInfo(forms.Form): username = forms.CharField( label='用户名', required=True, ) password = forms.CharField( label='密码', widget=forms.widgets.PasswordInput(render_value=True) ) #定义一个username字段的局部钩子,不能包含 “666” def clean_username(self): value = self.cleaned_data.get('username') #获取检验成功后的uesrname的值 if '666' in value: #如果包含了 666 raise ValidationError('不能包含666') #抛出错误 else: return value #如果不包含 666,则返回 username 的值,这里必须返回这个值 def index(request): if request.method == 'POST': obj = UserInfo(request.POST) if obj.is_valid(): return HttpResponse('通过') else: return HttpResponse('不通过') obj = UserInfo() return render(request,'index.html',{'obj': obj})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form action="" method="post"> {{ obj.as_p }} <input type="submit"> </form> </body> </html>