2016-12-27 73 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

我簡直就是這樣,是的,我的其他觀點已經成立了。 –