Из моего прочтения кода wtforms универсальный SubmitField отображает элемент HTML, который выглядит следующим образом:
<input type="submit" value="SOME TEXT LABEL">
Причина, по которой это происходит, заключается в том, что SubmitField
имеет подпись (вы можете отследить наследование, чтобы увидеть код генерации HTML):
class SubmitField(BooleanField):
"""
Represents an ``<input type="submit">``. This allows checking if a given
submit button has been pressed.
"""
widget = widgets.SubmitInput()
Чтобы вывести HTML, как вы хотите, вам нужно определить пользовательский виджет. Посмотрите документацию по этому вопросу.
Например, что-то вроде этого (непроверенное) может работать:
class MySubmitWidget(widgets.SubmitInput): # note subclassing the original
def __call__(self, field, **kwargs): # but overriding the render
return HTMLString('<button type="button" class="btn btn-primary"><span class="glyphicon glyphicon-envelope"></span> Envelope</button>')
class MySubmitField(SubmitField): # note subclassing the original
widget = MySubmitWidget # but overriding the render widget
И в своей форме вы просто используете MySubmitField
вместо этого. Если вы хотите дополнительно настроить или сделать HTML динамическим, вам нужно изменить метод __call__()
, чтобы генерировать HTML, реагирующий на kwargs
.
Обратите внимание, однако, что элементы <input type="submit">
имеют определенное действие по умолчанию, которое заключается в отправке формы, когда вы генерируете универсальный <button>
, он не будет автоматически отправлять вашу форму, поэтому вам, скорее всего, придется решать эту проблему дальше.