WTForms创建一个自定义小部件 [英] WTForms creating a custom widget
问题描述
I我试图做一个按钮类型,这不是输入在HTML:
提交= InlineButton(name ='submit',type ='submit ',title ='保存此页',textWithinSpan ='保存')
from flask.ext.wtf import Required,Length,EqualTo,Field,TextInput,html_params
从flask导入标记
class InlineButtonWidget(object):
text =''
html_params = staticmethod html_params)
$ b $ def __init __(self,input_type ='submit',** kwargs):
self.input_type = input_type
$ b $ def __call __(self,field, ** kwargs):
kwargs.setdefault('id',field.id)
kwargs.setdefault('type',self.input_type)
如果'value'不在kwargs:
kwargs ['value'] = field._value( )
return Markup('< button type =submit%s>< span>%s< / span>< / button>'%(self.html_params(name = field.name,** kwargs),kwargs ['textWithinSpan']))
class InlineButton(Field):$ b $ widget = InlineButtonWidget()
$ b $ def __init __(self ,label ='',** kwargs):
self.widget = InlineButtonWidget('submit',label)
def __call __(self,** kwargs):
return self.widget (自我):
如果self.data:
返回u' b返回u''
class SignupForm(Form):
name = TextField('Name',[Length(min = 1,max = 200)])
submit = InlineButton(name ='submit',type ='submit',title ='Save this page',textWithinSpan ='Save')
我甚至不需要Field派生对象。但是,当你仅仅使用Widget的时候,它并不会显示。
当你使用Field对象的时候,它会给你提供各种无效的参数错误。 p>
即使深入了解WTForms源代码,也很难理解为什么它不会将Kwargs从窗体传递给窗口小部件。
<好吧,提交问题后,我基本上想出了一个可行的解决方案:
在Update下有回答,但需要在Field派生类中使用此init。 The WTForms documentation is woefully inadequate, they don't even show you one single example of a custom widget that isn't derived from another widget already. I am trying to make a button type, that isn't "input" in html: submit = InlineButton(name='submit', type='submit', title='Save this page', textWithinSpan='Save') I shouldn't even need a Field derived object. But it doesn't display when you only use Widget by itself. And when you use the Field object, then it gives you all sorts of invalid parameter errors. Even delving into the WTForms source code makes it difficult to understand why it won't pass Kwargs from form to widget. --- UPDATE --- Ok, after I submit the question I basically figured out a workable solution:
Answered under Update, but needed this init inside Field derived class.
这篇关于WTForms创建一个自定义小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
$ $ p $ class InlineButtonWidget(object):
html_params = staticmethod(html_params)
$ b $ def __init __(self,input_type ='submit',text =''):
self.input_type = input_type
self.text = text
$ b $ def __call __(self,field,** kwargs):
kwargs.setdefault('id',field.id)
kwargs.setdefault('type',self.input_type)
如果'value'不在kwargs:
kwargs ['值'] = field._value()
返回标记( < / button>'(self.html_params(name = field.name,** kwargs),field.text))
class InlineButton(Field):$ b $ widget = InlineButtonWidget()
$ b $ def __init __(self,label = None,validators = None,text ='保存',** kwargs):
super(InlineButton,self).__ init __(label,validators,** kwargs)
self.text = text
def _value(self ):
if self.data:
return u''。join(self.data)
else:
return u''
$ b $ class SignupForm(Form):
name = TextField('Name',[Length(min = 1,max = 200)])
submit = InlineButton('submit',text ='Save',description ='Save this')
def __init __(self,label = None,validators = None ,text ='保存', ** kwargs):
super(InlineButton,self).__ init __(label,validators,** kwargs)
self.text = text
from flask.ext.wtf import Required, Length, EqualTo, Field, TextInput, html_params
from flask import Markup
class InlineButtonWidget(object):
text = ''
html_params = staticmethod(html_params)
def __init__(self, input_type='submit', **kwargs):
self.input_type = input_type
def __call__(self, field, **kwargs):
kwargs.setdefault('id', field.id)
kwargs.setdefault('type', self.input_type)
if 'value' not in kwargs:
kwargs['value'] = field._value()
return Markup('<button type="submit" %s><span>%s</span></button>' % (self.html_params(name=field.name, **kwargs), kwargs['textWithinSpan']))
class InlineButton(Field):
widget = InlineButtonWidget()
def __init__(self, label='', **kwargs):
self.widget = InlineButtonWidget('submit', label)
def __call__(self, **kwargs):
return self.widget(self, **kwargs)
def _value(self):
if self.data:
return u', '.join(self.data)
else:
return u''
class SignupForm(Form):
name = TextField('Name', [Length(min=1, max=200)])
submit = InlineButton(name='submit', type='submit', title='Save this page', textWithinSpan='Save')
class InlineButtonWidget(object):
html_params = staticmethod(html_params)
def __init__(self, input_type='submit', text=''):
self.input_type = input_type
self.text = text
def __call__(self, field, **kwargs):
kwargs.setdefault('id', field.id)
kwargs.setdefault('type', self.input_type)
if 'value' not in kwargs:
kwargs['value'] = field._value()
return Markup('<button type="submit" %s><span>%s</span></button>' % (self.html_params(name=field.name, **kwargs), field.text))
class InlineButton(Field):
widget = InlineButtonWidget()
def __init__(self, label=None, validators=None, text='Save', **kwargs):
super(InlineButton, self).__init__(label, validators, **kwargs)
self.text = text
def _value(self):
if self.data:
return u''.join(self.data)
else:
return u''
class SignupForm(Form):
name = TextField('Name', [Length(min=1, max=200)])
submit = InlineButton('submit', text='Save', description='Save this')
def __init__(self, label=None, validators=None, text='Save', **kwargs):
super(InlineButton, self).__init__(label, validators, **kwargs)
self.text = text