在python中将整数从视图传递到窗体

在python中将整数从视图传递到窗体,python,flask,wtforms,Python,Flask,Wtforms,我有一个带有queryselectfield的wtform,该字段当前填充了所有团队数据库中的数据: class PitScoutingForm(FlaskForm): team = QuerySelectField( query_factory=lambda: Teams.query.all(), get_label='number') 以及以下观点: @app.route('/competitions/pit-scouting', methods=['GET', '

我有一个带有queryselectfield的wtform,该字段当前填充了所有团队数据库中的数据:

class PitScoutingForm(FlaskForm):
    team = QuerySelectField(
        query_factory=lambda: Teams.query.all(), get_label='number')
以及以下观点:

@app.route('/competitions/pit-scouting', methods=['GET', 'POST'])
@login_required
def pit_scouting():
    form = PitScoutingForm(request.values)
    form.team.choices = [(a.id, a.number) for a in
                         Teams.query.order_by('number')]
这一切都很好。但是球队名单越来越大了,我想把在这个领域展示的球队限制在当前选定的比赛中,所以我把视角改为

@app.route('competitions/<int: comp_id>/pit-scouting', methods=['GET', 'POST'])
@app.route('competitions//pit scouting',methods=['GET','POST'])

但我不确定如何将comp_id从视图传递到表单,以便我可以过滤比赛id,从而只获得参加比赛的球队。我看到了,但我不太明白解决办法。感谢您的指点。

您在视图中使用comp\u id仅从该比赛中选择球队。更改comp_id,无论它在您的团队课程中被称为什么

@app.route('competitions/<int: comp_id>/pit-scouting', methods=['GET',  'POST'])
@login_required
def pit_scouting(comp_id):
    form = PitScoutingForm(request.values)
    form.team.choices = [(a.id, a.number) for a in Teams.query.filter_by(comp_id=comp_id).order_by('number')]
@app.route('competitions//pit scouting',methods=['GET','POST'])
@需要登录
def pit_侦察(公司id):
表单=PitScoutingForm(request.values)
form.team.choices=[(a.id,a.number)用于Teams.query.filter_by(comp_id=comp_id)。order_by('number')]
来自:

变量部分作为关键字参数传递给视图函数

这意味着您只需更新视图函数,将
comp_id
作为参数,如下所示:

@app.route('competitions/<int: comp_id>/pit-scouting', methods=['GET', 'POST'])
@login_required
def pit_scouting(comp_id):
    form = PitScoutingForm(request.values)
    form.team.choices = [(a.id, a.number) for a in
                     Teams.query.order_by('number')]
@app.route('competitions//pit scouting',methods=['GET','POST'])
@需要登录
def pit_侦察(公司id):
表单=PitScoutingForm(request.values)
form.team.choices=[(a.id,a.number)用于输入
Teams.query.order_by('number')]

谢谢大家的指点,你们引导我朝着一个有帮助的方向前进。我找到了另一个解决方案,建议使用一个普通的select字段,然后在init中加载选项,如下所示:

class PitScoutingForm(FlaskForm):
    team = SelectField('Team', coerce=int)
    ...
    def __init__(self, *args, **kwargs):
        super(PitScoutingForm, self).__init__(*args, **kwargs)
        self.team.choices = [(a.id, a.number) for a in Teams.query.order_by('number')]
然后,我的视图(忽略sql…有时它比sqlalchemy语法更简单)保持wrt设置选项的原样,除了使用传递给视图的竞争数据

@app.route('/pit-scouting/', defaults={'comp': 2}, methods=['GET', 'POST'])
@app.route('/pit-scouting/competitions/<int:comp>', methods=['GET', 'POST'])
@login_required
def pit_scouting(comp):
    sql_text = '''query here'''.format(comp)
    result = db.engine.execute(sql_text)

    form = PitScoutingForm(request.values)
    form.team.choices = [(a.id, a.number) for a in result]
@app.route('/pit scouting/',默认值={'comp':2},方法=['GET','POST'])
@app.route('/pit-scouting/competitions/',methods=['GET','POST'])
@需要登录
def pit_侦察(公司):
sql_text=''query here''。格式(comp)
结果=db.engine.execute(sql\u文本)
表单=PitScoutingForm(request.values)
form.team.choices=[(a.id,a.number)表示输入结果]

是的,我的其他视图都是这样设置的。这似乎没有什么帮助。默认表单(Teams.query.all())中设置的列表似乎没有被我在视图中所做的任何操作所覆盖。这可能是因为您在Pitscouting表单中加载了所有这些团队。