2016-12-27 5 views
0

У меня есть wtform с queryselectfield, что в настоящее время заполняется данными из базы данных со всеми командами:Pass целое число из поля зрения, чтобы сформировать в питона колбе

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

All это прекрасно работает. Но список команды растет довольно большой, и я хотел бы ограничить команды, которые показывают в этой области для выбранного соревнования, так что я бы изменить вид

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

, но я не уверен, как передать comp_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 устанавливая выбор, за исключением использования данных конкуренции, переданных в представление.

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

Я стенографировал это, да, мои другие взгляды уже настроены таким образом. –