Flask-WTF использует input=submit вместо кнопки type=submit

Я хотел бы, чтобы 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' : 'Сохранить текущую работу' })


person Dexter    schedule 20.01.2013    source источник


Ответы (2)


это просто, вы можете создать новый виджет, например 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 ))
person Mohammad Efazati    schedule 21.01.2013
comment
Хотелось бы лучшей документации flask-wtf. Я не могу правильно использовать виджет. Я пытаюсь создать класс, производный от Field, который использует ваш класс в качестве виджета, но он не отображается на странице, хотя все в порядке. Я собираюсь создать много форм, и я не хочу каждый раз использовать разные шаблоны, просто общий form.html - person Dexter; 24.01.2013
comment
Эта ранее существовавшая функция поля в шаблонах jinja2 не работает, она просто печатает мой виджет как escape-html вместо фактического html. Я не могу найти документацию по функции поля в jinja2, почему? - person Dexter; 24.01.2013
comment
Фильтр пользователя @Dexter {{safe}} в jinja2. для документации я предлагаю вам документы wtforms. не колба-wtf - person Mohammad Efazati; 24.01.2013
comment
Да, я использую документы wtforms, и не ясно, нужен ли мне сейф. {{safe}} используется при печати html, вы используете field() при печати полей wtforms, таких как TextField или SubmitField и т. д., они, похоже, вообще не нуждаются в безопасности. - person Dexter; 24.01.2013
comment
Я использую field(), как показано в html выше. Он печатает его как текст вместо html. Несмотря на то, что TextField, SubmitField, SelectField отлично работают с использованием field(). - person Dexter; 24.01.2013
comment
@Dexter, ты используешь что-то вроде этого? test = testy(_(test), widget=InlineButtonWidget()) - person Mohammad Efazati; 24.01.2013
comment
@Dexter, если не работает, попробуйте это {{ field(class=css_class, title=field.description, **kwargs|safe)}} - person Mohammad Efazati; 24.01.2013
comment
Я не использовал первый, но я сделал глупый класс inlineButtonField, который наследует класс Field и имеет _value() и виджет, установленный для вашего класса. Да, я попробую ключевое слово safe, я просто запутался, так как другим полям по умолчанию в WTForms это не нужно. Я чувствую, что что-то не так с вашим кодом self.html. Если бы я мог найти пример виджета WTForm, в котором есть html, это было бы проще. - person Dexter; 24.01.2013
comment
Я нашел пример в Интернете, и ваша функция call() возвращает self.html, но их функция возвращает HTMLString(self.html). Может ли это быть оно? См.: stackoverflow. ком/вопросы/8463421/ - person Dexter; 24.01.2013
comment
да, у меня вроде как работает, но он пытается отобразить метку, но я не хочу метку для кнопки отправки. Я поместил код, который использовал в исходном сообщении. Это выходит запутанным, хотя в шаблонах я использую field(), и область метки не определена. - person Dexter; 25.01.2013
comment
Хорошо, я думаю, что решил это здесь: stackoverflow.com/ вопросы/14510630/ - person Dexter; 25.01.2013
comment
Для чего это название? - person simanacci; 01.07.2017

Следующая реализация является более общей.

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')
person Pooja    schedule 07.10.2015