加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

自定义Form组件

发布时间:2020-12-15 17:21:03 所属栏目:大数据 来源:网络整理
导读:div id="cnblogs_post_body" class="blogpost-body" h1 class="title"一、获取类里面的静态属性以及动态属性的方法 p class="secondtitle"方式一: div class="cnblogs_code" = 123 = 123 = 456 = = = 123 = = 22 (cls,*args,** (cls. object. Foo2() = span

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


<div class="cnblogs_code">


= 123
     = 123= 456
    = =

= 123 = = 22 (cls,*args,**(cls. object.Foo2()

=<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.required:
        </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;required</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;调用自定义的异常</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;用户提交的数据</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_%s</span><span style="color: #800000;"&gt;"</span>%field_name,None)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;默认为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;根据错误的返回,如果没有错误返回True,有错误返回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;#########自定义生成标签3</span>
    <span style="color: #0000ff;"&gt;return</span> iter(self.fields.values())  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;返回的是一个迭代器</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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读