WTForms创建一个自定义小部件 [英] WTForms creating a custom widget

查看:137
本文介绍了WTForms创建一个自定义小部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

WTForms文档是非常不充分的,他们甚至不显示一个自定义小部件的例子,它不是从另一个小部件派生出来的。



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从窗体传递给窗口小部件。



<好吧,提交问题后,我基本上想出了一个可行的解决方案:



$ $ 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')


解决方案

在Update下有回答,但需要在Field派生类中使用此init。

  def __init __(self,label = None,validators = None ,text ='保存', ** kwargs):
super(InlineButton,self).__ init __(label,validators,** kwargs)
self.text = text


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')

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')

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:

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')

解决方案

Answered under Update, but needed this init inside Field derived class.

def __init__(self, label=None, validators=None, text='Save', **kwargs):
    super(InlineButton, self).__init__(label, validators, **kwargs)
    self.text = text

这篇关于WTForms创建一个自定义小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆