Передача переменной в класс WTForms - PullRequest
1 голос
/ 05 января 2020

Я относительно неопытен с Python и Flask, и застрял, пытаясь передать переменную в класс WTForms.

Вот что у меня есть:

views.py

@app.route('/teacher/tasks/new')
@login_required
def new_hw_task():
    classes = Class.query.filter_by(userid=current_user.userid).all()

    form = NewTaskForm(classes = classes)


    return render_template('/teacher/new_hw_task.html', form=form)

forms.py

class NewTaskForm(FlaskForm):

    classes = SelectMultipleField('Select classes to assign this homework to', choices = [("1", "Class 1"), ("2","Class 2")])

new_hw_task. html

<div class="form-group">
        {{ form.classes.label }}
        {{ form.classes(class_="form-control selectpicker", placeholder=form.classes.description, title="Select at least one class to assign", show_tick=true)}}
</div>

Я хочу переменную classes (экземпляр класса Class, определенный в models.py - да, да, я знаю, насколько небрежно иметь класс с именем 'Class') быть доступным в forms.py, чтобы я мог заменить варианты в SelectMultipleField на варианты из classes. Тем не менее, я не могу найти способ передать его (вы можете видеть, что я пытался поместить classes=classes в скобки после NewTaskForm).

На самом деле, мой предпочтительный способ сделать это - просто получите доступ к current_user (основанный на сеансе объект, установленный flask_login) из forms.py , но я, похоже, тоже не могу этого сделать, даже если я импортирую current_user вверху файла.

Кто-нибудь может мне объяснить, где я здесь не так, пожалуйста?

1 Ответ

1 голос
/ 09 января 2020

Документация WTForms для SelectField объясняет, как передавать переменные в форму из представления. Это так же просто, как присвоить список вариантов form.field.choices. В свою очередь вы удаляете аргумент ключевого слова choices= из конструктора поля.

Адаптированный для вашего случая, он будет выглядеть следующим образом.

@app.route('/teacher/tasks/new')
@login_required
def new_hw_task():
    classes = Class.query.filter_by(userid=current_user.userid).all()

    form = NewTaskForm()
    form.classes.choices = classes


    return render_template('/teacher/new_hw_task.html', form=form)
...