2016-12-27 2 views
0

ich eine wtform mit einem queryselectfield haben, die zur Zeit mit Daten aus der Datenbank mit allen Mannschaften auffüllt:Pass ganze Zahl von Ansicht in Python Kolben bilden

class PitScoutingForm(FlaskForm): 
    team = QuerySelectField(
     query_factory=lambda: Teams.query.all(), get_label='number') 

und die Aussicht:

@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')] 

Alle das funktioniert gut. Aber das Team Liste wächst ziemlich groß, und ich möchte die Teams begrenzen, die auf den aktuell ausgewählten Wettbewerb auf diesem Gebiet zeigen, so würde ich den Blick auf

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

ändern, aber ich bin nicht sicher, Wie man die comp_id von der Ansicht an das Formular weitergibt, damit ich die Wettbewerbs-ID filtern kann, damit ich nur die Teams bekomme, die in diesem Wettbewerb sind. Ich sah this entry, aber ich verstehe die Lösung nicht ganz. Alle Hinweise geschätzt.

Antwort

0

Danke für die Zeiger Jungs, führte man mich in eine Richtung, die geholfen haben. Ich fand eine andere Lösung, die ein einfaches Auswahlfeld vorgeschlagen und anschließend die Auswahl Laden in init diese statt wie:

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')] 

dann meiner Ansicht (die SQL ignorieren ... manchmal ist es einfacher als sqlalchemy Syntax) bleibt wie WRT Festlegen der Auswahlmöglichkeiten, mit Ausnahme der Wettbewerbsdaten, die an die Ansicht übergeben wurden.

@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

Sie verwenden die comp_id aus Ihrer Sicht, um nur die Teams aus diesem Wettbewerb auszuwählen. Ändern Sie comp_id nach dem Namen in Ihrer Teamklasse.

@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

das scheint nicht zu helfen. Die Liste, die in dem Standardformular (Teams.query.all()) festgelegt wird, scheint von allem, was ich in der Ansicht mache, nicht überschrieben zu werden. –

+1

Das liegt wahrscheinlich daran, dass Sie alle diese Teams in Ihr PitScoutingForm laden. –

0

Vom Flask Documentation on URL Route Registration:

Variable Teile sind der Ansicht Funktion als Keyword-Argumente übergeben.

Das heißt, Sie müssen nur Ihre View-Funktion aktualisieren comp_id als Parameter zu haben, etwa so:

@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

ich shorthanded, ja, meine anderen Ansichten sind bereits so eingerichtet. –