【问题标题】:How to set the default option for a select field using Jinja templates如何使用 Jinja 模板为选择字段设置默认选项
【发布时间】:2022-01-31 22:37:41
【问题描述】:

我需要使用 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 个成员,我将显示三个选择字段并自动选择这三个成员。

【问题讨论】:

  • 为什么不为您的 SelectField 定义提供“选择”?
  • 因为选择是动态的。每个团队都有不同的成员,所以每次选择都会改变。
  • 您可以在 myview 中生成动态选择,如下所示 stackoverflow.com/questions/12850605/…
  • 我的问题不是选择,我的问题是每个选择字段都显示顶部选项,但我需要显示团队成员是选择字段的默认选项。

标签: flask jinja2


【解决方案1】:

这里有两个问题:

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

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

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

    只需以 (value,label) 的形式传入一个元组。您的值可以是整数、字符串等。 (您还缺少一个提交按钮,我认为这是偶然的。)

  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>
    

【讨论】:

  • 例如这里有 5 个用户。这 5 个用户是选择,但团队“A”有 3 个成员,即 1、2、5。其余用户不在团队中。现在我们必须显示团队“A”的三个成员。详细信息 select-field1---> shows--->1, select-field2--->shows--->2,select-field3--->shows--->5 这样。
  • 目前我已经在下拉列表中显示了用户,但我的问题是“三个团队成员是选择字段的选定值”。现在你可以理解我的问题了。谢谢。
  • 好的,我尝试编辑我建议的代码。看看我做了什么。祝你好运!
【解决方案2】:

我找到了一个非常适合我的解决方案。

如果您查看SelectField 类型的表单对象,您会看到 Jinja 将默认呈现为选中的字段。例如:

type = SelectField('Company Type', choices=type_choices, default=1)

在上面的示例中,Jinja 将呈现一个选择,其选项将具有选定值,其中 value=1

检查在我的视图中实例化的表单对象,我验证了满足这个条件的三个字段:

form.type.data = "1" # ---> string
form.type.default = 1 # ---> int
form.type.object_data = 1 # ---> int

因此,将这三个值替换为来自数据库、内部视图的数据,我能够在 Jinja 中创建一个动态默认选择,而无需对我的 HTML 或表单进行任何更改:

form = EnterpriseForm()
result = "query to database"
form.type.data = str(result.id_enterprise_type)
form.type.default = result.id_enterprise_type
form.type.object_data = result.id_enterprise_type

我希望这些信息对其他人有所帮助。

【讨论】:

  • 除非您打算将自己的答案用作选定的解决方案,否则请不要添加答案。如果您不这样做,请投票并选择回答问题的解决方案。
  • 好的,但这也是一个有效的解决方案,不是吗?我的想法是帮助其他有类似问题的人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多