gpt4 book ai didi

python - WTForms 创建自定义小部件

转载 作者:太空狗 更新时间:2023-10-29 21:40:24 26 4
gpt4 key购买 nike

WTForms 文档严重不足,它们甚至没有向您展示一个不是从另一个小部件派生的自定义小部件的示例。

我正在尝试制作一个按钮类型,它不是 <input>在 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')

我什至不需要 Field 派生对象。但是当你只使用 Widget 本身时它不会显示。

当您使用 Field 对象时,它会给您各种无效参数错误。

即使深入研究 WTForms 源代码也很难理解为什么它不会将 Kwargs 从表单传递到小部件。

---更新---

好的,提交问题后我基本上找到了一个可行的解决方案:

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

最佳答案

在 Update 下回答,但需要在 Field 派生类中进行初始化。

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

关于python - WTForms 创建自定义小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14510630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com