Flask-WT Form:如何为Form传递额外的参数



在一个jinja模板我想有一个类的形式:

{% macro build_form(form) %}
<form class="{{ form.form_class  }}" role="form" method="post" action="" class="text-start">
{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
<div class="{{ field.render_kw.container2_class  }}">
<div class="{{ field.render_kw.container1_class  }}">
<label class="form-label"> {{ field.label }}</label>
{{ field}}
</div>
...

我想把它作为形式的参数传递,比如

user_form = UserForm(obj=user, form_class="row")

但是,它在模板中不被识别。如何以及在哪里可以发送这些参数。

最简单的方法是创建一个自定义表单,您可以将类名作为字符串关键字kwargs传递,然后使用该表单作为需要支持该类字符串的所有表单的基类。例如:

class CustomForm(Form):
def __init__(self, formdata=None, obj=None, prefix="", data=None, meta=None, **kwargs):
self.form_class = kwargs.pop('form_class', None)
super(CustomForm, self).__init__(formdata, obj, prefix, data, meta, **kwargs)

使用示例:

from flask import Flask, render_template_string
from wtforms import Form, StringField
app = Flask(__name__)

class CustomForm(Form):
def __init__(self, formdata=None, obj=None, prefix="", data=None, meta=None, **kwargs):
self.form_class = kwargs.pop('form_class', None)
super(CustomForm, self).__init__(formdata, obj, prefix, data, meta, **kwargs)

class TestForm(CustomForm):
first_name = StringField()

html_template = '''
<form class="{{ form.form_class }}" role="form" method="post" action="">
{{ form.first_name }}
</form>
'''

@app.route('/')
def custom_form():
_form = TestForm(form_class='form-class')
return render_template_string(html_template, form=_form)

if __name__ == '__main__':
app.run()

最新更新