Forms 表单数据的动态路由

Forms 表单数据的动态路由,forms,flask,routing,wtforms,Forms,Flask,Routing,Wtforms,我是一个新手,在从表单数据创建动态url时遇到了问题。特别是从WTFORMS的SelectField的值。我的代码如下 <form class="form-style-7" action="{{ url_for('event_select', sports=form.sports.sport) }}" method="post"> <ul> <li name="sport"> {{ form.sports.label}} {{

我是一个新手,在从表单数据创建动态url时遇到了问题。特别是从WTFORMS的SelectField的值。我的代码如下

<form  class="form-style-7" action="{{ url_for('event_select',     sports=form.sports.sport) }}" method="post">
  <ul>
    <li name="sport">
      {{ form.sports.label}} {{ form.sports }}
    </li>

    <li>
      {{ form.start_after_date.label }} {{ form.start_after_date }}
    </li>
    <li>
      {{ form.start_before_date.label }} {{ form.start_before_date }}
    </li>

    &nbsp;
    &nbsp;
   <li>
    <input type="submit" value="Next">
   </li>
</ul>
</form>
我的表格是这样的

from flask_wtf import Form
from wtforms import SelectField
from wtforms.fields.html5 import DateField


class SelectEventForm(Form):
    sports = SelectField(u'Select Sport')
    start_after_date = DateField('Starts After Date')
    start_before_date = DateField('Starts Before Date')
我的控制器有以下代码

@app.route('/event', methods=['GET', 'POST'])
def event():
    form = SelectEventForm(request.form)
    sports = betfair_client.call_rest_api('listEventTypes/', {"filter": {}})
    form.sports.choices = []
    for sport in sports:
       for key in sport:
           form.sports.choices.append((key, sport[key]))
   return render_template('events.html', form=form)


@app.route('/event/<sports>', methods=['GET', 'POST'])
def event_select(sports):
    #print request.form
    #print request.form.get('sports')
    return render_template('events_two.html')
@app.route('/event',methods=['GET',POST'])
def事件():
form=SelectEventForm(request.form)
sports=betfair\u client.call\u rest\u api('listenttypes/',{“filter”:{})
form.sports.choices=[]
运动中的运动:
运动钥匙:
form.sports.choices.append((key,sport[key]))
返回呈现模板('events.html',form=form)
@app.route('/event/',methods=['GET','POST'])
def事件_选择(运动):
#打印请求表
#打印request.form.get('sports')
返回呈现模板('events\u two.html')
html格式如下所示

<form  class="form-style-7" action="{{ url_for('event_select',     sports=form.sports.sport) }}" method="post">
  <ul>
    <li name="sport">
      {{ form.sports.label}} {{ form.sports }}
    </li>

    <li>
      {{ form.start_after_date.label }} {{ form.start_after_date }}
    </li>
    <li>
      {{ form.start_before_date.label }} {{ form.start_before_date }}
    </li>

    &nbsp;
    &nbsp;
   <li>
    <input type="submit" value="Next">
   </li>
</ul>
</form>

  • {{form.sports.label}{{{form.sports}}
  • {{form.start\u之后的日期.label}{{{form.start\u之后的日期}}
  • {{form.start\u before\u date.label}{{{form.start\u before\u date}}
我想做的是使用SelectField中的值来生成url。我已经在这上面呆了一段时间了。表单本身和下拉列表正确显示所有内容


谢谢

我会把你的表单改回它的生成页面,然后从那里处理逻辑。所以改变

{{ url_for('event_select', sports=form.sports.sport) }}
只是:

{{ url_for('event') }}
然后将
事件
方法调整为:

from flask import redirect

@app.route('/event', methods=['GET', 'POST'])
def event():
    form = SelectEventForm(request.form)

    if form.validate_on_submit():
        chosen_sport = form.sports.data
        return redirect(url_for('event_select', sports=chosen_sport))

    sports = betfair_client.call_rest_api('listEventTypes/', {"filter": {}})
    form.sports.choices = []
    for sport in sports:
       for key in sport:
           form.sports.choices.append((key, sport[key]))
   return render_template('events.html', form=form)

我们所做的就是从提交的表单中获取所选运动,然后从表单元素中获取所选运动,然后使用它将用户重定向到以所选运动为参数的
事件选择方法。

很好的解释,谢谢。我曾想过引入一个中间人功能作为一种解决方法,但我认为一定有更好的方法,这样看起来不错。你能解释一下为什么我们要传递request.form来实例化表单对象吗?这让我开始感到困惑。谢谢,实际上,如果您使用的是Flask WTF,您根本不需要提供它,因为它会自动获取
请求.form
。原因是,当您创建表单(
form=ExampleForm()
)时,表单是空的(例如form.sports.data将是空的),因此您希望WTF将http表单转换为python表单对象,您可以通过向表单提供
request.form
对象来实现这一点,这样它就知道在哪里查找需要填充的任何数据。