微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义Form组件

<div id="cnblogs_post_body" class="blogpost-body">
<h1 class="title">一、获取类里面的静态属性以及动态属性方法
<p class="secondtitle">方式一:


<div class="cnblogs_code">


= 123
     __init__= 123= 456
    = =获取对象属性获取类里面的所有属性以及方法

= 123 __init__= = 22 获取当前类的 __new__(cls,*args,**kwargs): (cls. object.__new__Foo2()

自定义Form组件示例

copy 自定义异常 __init__=<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;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; return self.widgets</span>
    <span style="color: #0000ff;"&gt;return</span> str(self.widgets)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;将对象转成字符串</span>

<span style="color: #0000ff;">class<span style="color: #000000;"> CharField(Field):

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; valid(self,val):
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; self.<a href="/tag/required/" target="_blank" class="keywords">required</a>:
        </span><span style="color: #0000ff;"&gt;if</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; val:
            msg </span>= self.error_message[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;<a href="/tag/required/" target="_blank" class="keywords">required</a></span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;]
            </span><span style="color: #0000ff;"&gt;raise</span> ValidateError(msg)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a><a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>的异常</span>
    <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; 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;"&gt;def</span><span style="color: #000000;"&gt; is_valid(self):
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;<a href="/tag/yonghu/" target="_blank" class="keywords">用户</a>提交的数据</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; self.data  #{'username':"zzz","pwd":18}</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; self.fields #{'username': CharField(),"pwd": EmailField()}</span>
    <span style="color: #0000ff;"&gt;for</span> field_name,field <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; self.fields.items():
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt;:
            input_val </span>=<span style="color: #000000;"&gt; self.data.get(field_name)
            </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; print("---------------",field_name,input_val)</span>
            val = field.valid(input_val)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;内置的验证规则自己去验证</span>
            method = getattr(self,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;clean_<a href="/tag/s/" target="_blank" class="keywords">%s</a></span><span style="color: #800000;"&gt;"</span>%field_name,None)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;<a href="/tag/mo/" target="_blank" class="keywords">默</a>认为None</span>
            <span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; method:
                val </span>=<span style="color: #000000;"&gt; method(val)
            self.clean_data[field_name] </span>=<span style="color: #000000;"&gt; val
        </span><span style="color: #0000ff;"&gt;except</span><span style="color: #000000;"&gt; ValidateError as e:
            self.errors[field_name] </span>=<span style="color: #000000;"&gt; e.detail
    </span><span style="color: #0000ff;"&gt;return</span> len(self.errors) ==0 <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;根据<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>的返回,如果没有<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>返回True,有<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>返回False</span>

<span style="color: #0000ff;"&gt;def</span>  <span style="color: #800080;"&gt;__iter__</span>(self):  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;#########<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a><a href="/tag/biaoqian/" target="_blank" class="keywords">标签</a>3</span>
    <span style="color: #0000ff;"&gt;return</span> iter(self.fields.values())  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;返回的是<a href="/tag/yige/" target="_blank" class="keywords">一个</a>迭代器</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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐