2016-12-27 31 views
0

我有,目前的数据填充从所有球队的数据库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']) 

,但我不知道如何将视图中的comp_id传递给表单,以便我可以过滤出竞争对手的ID,这样我只能得到那些参加比赛的球队。我看到this entry,但我不太明白解决方案。任何指针赞赏。

回答

0

感谢您的指针家伙,你使我在帮助一个方向。我发现提示使用一个普通的选择字段,然后加载在初始化,而不是像这样的选择,另一种解决方案:

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] 
0

您在视图中使用comp_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')] 
+0

这似乎并没有帮助。在默认窗体(Teams.query.all())中设置的列表似乎不会被我在视图中所做的任何操作覆盖。 –

+1

这可能是因为你在PitScoutingForm中加载了所有这些团队。 –

0

Flask Documentation on URL Route Registration

变量部件被传递到作为关键字参数视图函数。

这意味着你只需要更新您的视图功能有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')] 
+0

我简直就是这样,是的,我的其他观点已经成立了。 –