为Jinja中的flask wtforms selectfield选择默认值以获取动态数据

时间:2019-02-22 08:38:19

标签: python-3.x flask jinja2 flask-wtforms

我正在尝试为选择字段设置默认值,该选择字段是使用html页面中的jinja使用for循环动态生成的选择字段,我无法在文档中找到解决方案。基本上,我需要一种方法,如果可能的话,使用jinja设置selectfield的默认值。

我无法在python的路由侧或表单侧设置默认值,因为这些字段是动态生成的,并且默认值需要根据选择而有所不同。如果我使用字符串字段而不使用选择字段,则可以设置默认值。

有人可以帮我找到解决此问题的方法吗?我可以切换到其他表单域而不是选择域吗?

第二个问题是,如果我将id和name设置为生成html页面时的样子,那么我提交并提交时仍可以与其他wtform字段一起使用的html手动字段吗?如果可能的话,我也许可以用这种方式解决我的问题。

有关如何将字符串字段转换为selectfield的代码:

{% for d in data %}
{{ form.type.label(class="label") }}
{{ form.type(class="field", value=d.type) }}
{% endfor %}

谢谢

2 个答案:

答案 0 :(得分:1)

关于使用WTForms和Jinja2设置动态数据来设置SelectField的默认值,您可以使用以下示例:

首先,在表单中定义SelectField。

class MyForm(FlaskForm):
    country_id = SelectField("Country", coerce=int) #[('1','USA'),..])

然后查询数据库以构建可用值列表。

@app.route("/...")
def country(): 
   form = MyForm()
   available_countries=db.session.query(Country).all()
   countries_list=[(i.id, i.name) for i in available_countries]
   form.country_id.choices = countries_list

最后在html中,使用process_data定义所选值。 注意:不使用z变量。

{% set z = form.country_id.process_data(countryNameVariable) %}
{{ form.country_id(class="")}}

答案 1 :(得分:0)

这是我想到的唯一方法

您可以在views.py

中添加类似的内容
@app.route('/')
def index():
    data=[{'name':'red'}, {'name':'green'}, {'name':'blue'}]
    return render_template('index.html', data=data)

以及您的html模板

<select name="colour" class="select-field">
    {% set default_value = 'green' %}
    {% for d in data %}
    <option value="{{ d.name }}" {% if d.name == default_value %}selected="selected"{% endif %}>{{ d.name }}</option>
    {% endfor %}
</select>