【问题标题】:Flask-WTF uses input=submit instead of button type=submitFlask-WTF 使用 input=submit 而不是 button type=submit
【发布时间】:2013-01-03 21:54:44
【问题描述】:

我想使用 Flask 的“SubmitField”

<button type="submit" title="Save this form"><span>Save</span></button>

代替:

<input type="submit" title="Save this form" />

我在模板中打印出来:

{{ field(class=css_class, title=field.description, **kwargs) }}

我猜我必须以某种方式修改 SubmitInput(SubmitField 后面的小部件),但我不确定如何准确地做到这一点,我是否必须以某种方式修改 __html__()?

编辑:

from flask.ext.wtf import Required, Length, EqualTo, Field, TextInput
from flask import Markup
class InlineButtonWidget(object):
    html = """
    <button type="submit" title="%s"><span>%s</span></button>
    """

    def __init__(self, input_type='submit'):
        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 HTMLString(self.html % (field.name, field.label ))


class InlineButton(Field):
  widget = InlineButtonWidget()
  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('sign up')

我希望能够做到这一点:

submit = InlineButton({'name' : 'submit', 'title' : '今天注册有奖。', 'type' : 'submitfieldtype', 'textInsideSpan' : '保存当前工作' } )

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    很简单,您可以创建像 InlineButtonWidget() 这样的新小部件,但我认为最好从表单中删除提交并在模板中使用它

    <button type="submit" title="Save this form"><span>Save</span></button>
    

    当然你也可以使用它:

    {% for name, label in buttons %}
        <button type="submit" title="{{name}}"><span>{{name}}</span></button>
    {% endfor %}
    

    示例小部件:

    class InlineButtonWidget(object):
        html = """
        <button type="submit" title="%s"><span>%s</span></button>
        """
    
        def __init__(self, input_type='submit'):
            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 HTMLString(self.html % (field.name, field.lable ))
    

    【讨论】:

    • 我希望有更好的 flask-wtf 文档。我似乎无法正确使用小部件。我正在尝试构建一个使用您的类作为小部件的字段派生类,但即使一切正常,它也没有出现在页面上。我要构建很多表单,我不想每次都使用不同的模板,只是一个通用的 form.html
    • jinja2 模板中这个预先存在的“字段”功能不起作用,它只是将我的 Widget 打印为 escaped-html 而不是打印实际的 html。我在 jinja2 中找不到任何关于“字段”功能的文档,为什么?
    • @Dexter 用户 {{safe}} 过滤器在 jinja2 中。对于文档,我建议您使用 wtforms 文档。不是烧瓶-wtf
    • 是的,我正在使用 wtforms 文档,但不清楚我是否需​​要“安全”。 {{safe}}打印html时使用,打印wtforms字段时使用field(),例如TextField或SubmitField等,它们似乎根本不需要“安全”。
    • 我在网上找到了一个例子,你的call()函数返回self.html,而他们的返回HTMLString(self.html)。会是这样吗?见:stackoverflow.com/questions/8463421/…
    【解决方案2】:

    以下实现更通用。

    from wtforms.widgets.core import html_params
    from wtforms.widgets import HTMLString
    
    class InlineButtonWidget(object):
        """
        Render a basic ``<button>`` field.
        """
        input_type = 'submit'
        html_params = staticmethod(html_params)
    
        def __call__(self, field, **kwargs):
            kwargs.setdefault('id', field.id)
            kwargs.setdefault('type', self.input_type)
            kwargs.setdefault('value', field.label.text)
            return HTMLString('<button %s>' % self.html_params(name=field.name, **kwargs))
    
    
    class InlineSubmitField(BooleanField):
        """
        Represents an ``<button type="submit">``.  This allows checking if a given
        submit button has been pressed.
        """
        widget = InlineButtonWidget()
    
    
    class SignupForm(Form):
        name = TextField('Name', [Length(min=1, max=200)])
        submit = InlineSubmitField('sign up')
    

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2013-09-07
      • 1970-01-01
      • 2010-12-20
      • 2014-02-19
      • 1970-01-01
      • 2015-11-14
      • 2018-05-06
      • 1970-01-01
      相关资源
      最近更新 更多