=<span style="color: #008000;">#<span style="color: #008000;"> ===========自定义插件===============
<span style="color: #0000ff;">class<span style="color: #000000;"> TextInput(object):
<span style="color: #0000ff;">def <span style="color: #800080;">str<span style="color: #000000;">(self):
<span style="color: #0000ff;">return <span style="color: #800000;">'<span style="color: #800000;"><input type="text"><span style="color: #800000;">'
<span style="color: #0000ff;">class
<span style="color: #000000;"> EmailInput(object):
<span style="color: #0000ff;">def <span style="color: #800080;">
str<span style="color: #000000;">(self):
<span style="color: #0000ff;">return <span style="color: #800000;">'<span style="color: #800000;"><input type="email"><span style="color: #800000;">'
<span style="color: #008000;">#<span style="color: #008000;"> ============字段:内部包含正则用于验证======================
<span style="color: #0000ff;">class<span style="color: #000000;"> Field(object):
<span style="color: #0000ff;">def <span style="color: #800080;">init(self,required=True,error_message=None,widgets=<span style="color: #000000;"> None):
self.required =<span style="color: #000000;"> required
self.error_message =<span style="color: #000000;"> error_message
<span style="color: #0000ff;">if <span style="color: #0000ff;">not<span style="color: #000000;"> widgets:
self.widgets = TextInput() <span style="color: #008000;">#<span style="color: #008000;">设置默认
<span style="color: #0000ff;">else<span style="color: #000000;">:
self.widgets =<span style="color: #000000;"> widgets
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> return self.widgets</span>
<span style="color: #0000ff;">return</span> str(self.widgets) <span style="color: #008000;">#</span><span style="color: #008000;">将对象转成字符串</span>
<span style="color: #0000ff;">class<span style="color: #000000;"> CharField(Field):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> valid(self,val):
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> self.required:
</span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> val:
msg </span>= self.error_message[<span style="color: #800000;">'</span><span style="color: #800000;">required</span><span style="color: #800000;">'</span><span style="color: #000000;">]
</span><span style="color: #0000ff;">raise</span> ValidateError(msg) <span style="color: #008000;">#</span><span style="color: #008000;">调用自定义的异常</span>
<span style="color: #0000ff;">return</span><span style="color: #000000;"> val
<span style="color: #0000ff;">class<span style="color: #000000;"> EmailField(Field):
ERG = <span style="color: #800000;">"<span style="color: #800000;">^w+@w+$<span style="color: #800000;">"
<span style="color: #0000ff;">def<span style="color: #000000;"> valid(self,val):
<span style="color: #0000ff;">if<span style="color: #000000;"> self.required:
<span style="color: #0000ff;">if <span style="color: #0000ff;">not<span style="color: #000000;"> val:
msg = self.error_message[<span style="color: #800000;">'<span style="color: #800000;">required<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #0000ff;">raise<span style="color: #000000;"> ValidateError(msg)
<span style="color: #008000;">#<span style="color: #008000;"> print(val,type(val))
result =<span style="color: #000000;"> re.match(self.ERG,val)
<span style="color: #0000ff;">if <span style="color: #0000ff;">not<span style="color: #000000;"> result:
msg = self.error_message.get(<span style="color: #800000;">'<span style="color: #800000;">invalid<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">格式错误<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">raise<span style="color: #000000;"> ValidateError(msg)
<span style="color: #0000ff;">return<span style="color: #000000;"> val
<span style="color: #008000;">#<span style="color: #008000;"> ==========================
<span style="color: #0000ff;">class<span style="color: #000000;"> Form(object):
<span style="color: #0000ff;">def <span style="color: #800080;">init<span style="color: #000000;">(self,data):
<span style="color: #008000;">#<span style="color: #008000;"> print(UserForm.dict)#获取派生类中的所有静态字段
<span style="color: #008000;">#<span style="color: #008000;"> print(self.class.dict) #静态动态的获取类中的所有静态字段
self.data =<span style="color: #000000;"> data
self.fields = copy.deepcopy(self.<span style="color: #800080;">class.declare_field) <span style="color: #008000;">#<span style="color: #008000;">获取字段
self.clean_data =<span style="color: #000000;"> {}
self.errors =<span style="color: #000000;"> {}
<span style="color: #0000ff;">def <span style="color: #800080;">new(cls,**kwargs): <span style="color: #008000;">#<span style="color: #008000;">在new里面也可以获取类中的所有静态字段
declare_field =<span style="color: #000000;"> {}
<span style="color: #0000ff;">for field_name,field <span style="color: #0000ff;">in cls.<span style="color: #800080;">dict<span style="color: #000000;">.items():
<span style="color: #008000;">#<span style="color: #008000;"> print(field_name,field)
<span style="color: #0000ff;">if<span style="color: #000000;"> isinstance(field,Field):
declare_field[field_name] =<span style="color: #000000;"> field
cls.declare_field =<span style="color: #000000;"> declare_field
<span style="color: #0000ff;">return object.<span style="color: #800080;">new(cls) <span style="color: #008000;">#<span style="color: #008000;">创建对象
<span style="color: #0000ff;">def</span><span style="color: #000000;"> is_valid(self):
</span><span style="color: #008000;">#</span><span style="color: #008000;">用户提交的数据</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> self.data #{'username':"zzz","pwd":18}</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> self.fields #{'username': CharField(),"pwd": EmailField()}</span>
<span style="color: #0000ff;">for</span> field_name,field <span style="color: #0000ff;">in</span><span style="color: #000000;"> self.fields.items():
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:
input_val </span>=<span style="color: #000000;"> self.data.get(field_name)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> print("---------------",field_name,input_val)</span>
val = field.valid(input_val) <span style="color: #008000;">#</span><span style="color: #008000;">内置的验证规则自己去验证</span>
method = getattr(self,<span style="color: #800000;">"</span><span style="color: #800000;">clean_%s</span><span style="color: #800000;">"</span>%field_name,None) <span style="color: #008000;">#</span><span style="color: #008000;">默认为None</span>
<span style="color: #0000ff;">if</span><span style="color: #000000;"> method:
val </span>=<span style="color: #000000;"> method(val)
self.clean_data[field_name] </span>=<span style="color: #000000;"> val
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> ValidateError as e:
self.errors[field_name] </span>=<span style="color: #000000;"> e.detail
</span><span style="color: #0000ff;">return</span> len(self.errors) ==0 <span style="color: #008000;">#</span><span style="color: #008000;">根据错误的返回,如果没有错误返回True,有错误返回False</span>
<span style="color: #0000ff;">def</span> <span style="color: #800080;">__iter__</span>(self): <span style="color: #008000;">#</span><span style="color: #008000;">#########自定义生成标签3</span>
<span style="color: #0000ff;">return</span> iter(self.fields.values()) <span style="color: #008000;">#</span><span style="color: #008000;">返回的是一个迭代器</span>
<span style="color: #008000;">#<span style="color: #008000;"> =======================
<span style="color: #0000ff;">class<span style="color: #000000;"> UserForm(Form):
username = CharField(error_message={<span style="color: #800000;">'<span style="color: #800000;">required<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">用户名不能为空<span style="color: #800000;">'},widgets=<span style="color: #000000;">TextInput())
<span style="color: #008000;">#<span style="color: #008000;"> email = EmailField(error_message={'required': '密码不能为空','invalid': '邮箱格式错误'},widgets=EmailInput())
<span style="color: #000000;">
obj = UserForm(data={<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">':<span style="color: #800000;">"<span style="color: #800000;">haiyan<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">email<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">dsfsgd<span style="color: #800000;">"<span style="color: #000000;">})
<span style="color: #0000ff;">if<span style="color: #000000;"> obj.is_valid():
<span style="color: #0000ff;">print<span style="color: #000000;">(obj.clean_data)
<span style="color: #0000ff;">else<span style="color: #000000;">:
<span style="color: #0000ff;">print(obj.errors)