如何使用jinja模板为选择字段设置默认选项

时间:2016-07-07 04:43:36

标签: flask jinja2

我需要使用jinja模板添加默认选项值以选择字段。

form.py

class TeamForm(Form):
    user = SelectField(u'Team Member')

views.py

class myview(request,id):
    form = TeamForm(request.form)
    members =db.session.query(teams).filter_by(t_id = id).all()
    return render_template("members.html",form=form,members=members)

member.html

<table>
 {% for member in members%}
 <tr>
     <td>{{ form.user(class_="form-control",value=user.id) }}</td>
 </tr>
 {% endfor %}
</table>

分配的选项值未显示在输出中。

在这里,我必须根据团队中的成员循环选择字段。 例如,如果团队有3个成员,我将显示这三个成员自动选择的三个选择字段。

任何人都可以帮助我吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

你有两个问题在这里:

(1)要在表单中实现默认值,只需在form.py中使用SelectField类的default=(value, label)选项。

假设您希望默认为Johnny作为您的团队成员,并且该选项的数值为0.然后您可以使用default=(value, label)执行类似的操作:

class TeamForm(Form):
    user = SelectField(u'Team Member', default=(0, "Johnny"))

只需传入表单中的元组(值,标签)。你的值可以是int,字符串等等。 (你也错过了一个提交按钮,我认为这是偶然的。)

(2)我不确定你在意见中做了什么。你说,“在这里我必须根据团队中的成员来循环选择字段。例如,如果团队有3个成员,我将显示三个选择字段,由这三个成员自动选择。”您是说您需要在呈现表单时在下拉字段中向用户显示这些内容,还是在呈现模板时实际向用户显示查询结果?

因为你有一个表格,我假设你将通过POST向服务器提交数据。典型的视图模式创建一个空白表单对象,并在通过GET请求呈现模板时将其传递给用户。当用户输入数据并提交数据时,它将通过POST请求发送。我还注意到你使用了一个类来表达你的观点。我建议使用装饰器代替你的路由并让它调用一个函数。

例如,如果您在表单中有三个选项,并且想要在下拉列表中向用户显示这些选项,那么您需要实现以下内容:

form.py:

# Sample Form class; choices can be overridden later.

       class TeamForm(Form):
            user = SelectField(u'Team Member', default=(0, "Johnny"), choices=[(0, "Johnny"), (1, "Sarah"), (2, "Bill")])
            submit= SubmitField('Submit')

view.py

@app.route('/team', methods=['GET','POST'])
def team_view(id):
     user_selection = None
     form = TeamForm()
     #  This code block will only execute on POST
     if request.method == 'POST':
          if form.validate_on_submit():
              user_selection = form.user.data
              form.user.data = ''
              return redirect(url_for(some-other-page.html))
     members =db.session.query(teams).filter_by(t_id = id).all()

     # This next line will override the default choices in your form.
     form.user.choices = [(member.id, member.name) for member in members]

     return render_template("members.html",form=form)

member.html

选项1:

   <!-- Assume you're using Flask-Bootstrap & WTForms -->
    {% import "bootstrap/wtf.html" as wtf %}

    <!-- Render your Team form; this is where you call to your form object -->
    {{ wtf.quick_form(form) }}

选项2:

    <!-- Manually construct your template --> 
<form method="POST" action="/team">
    <div>{{ form.user }}</div>
    <div>{{ form.submit() }}</div>
</form>