Предварительное заполнение BooleanField как отмеченного (WTForms)

На всю жизнь я не могу понять, как предварительно заполнить BooleanField с помощью WTForms. У меня есть поле под названием «активное». По умолчанию он не проверяется и не требуется. Итак, я настроил это как ...

class QuestionForm(Form):
    question = TextField('Question', [validators.Required()])
    slug = TextField('Slug', [validators.Required()])
    active = BooleanField('Active')

Затем у меня есть СТРАНИЦА РЕДАКТИРОВАНИЯ, где я показываю форму для «вопроса», который хочу отредактировать.

{{ form.question.label }}
{{ form.question(value=q.question) }}

{{ form.active(value=q.active) }} Show this question?

Если «active» имеет значение True, я бы хотел, чтобы у BooleanField (флажок) был атрибут «checked». А если False, то не делать этого. Но я даже не могу понять, как сделать так, чтобы флажок имел отмеченное состояние при рендеринге формы, не говоря уже об условной части.

Единственный способ, которым я смог проверить это, - это добавить default = True при определении формы. Но это не то, что мне нужно.

Я пробовал использовать 'default', 'initial', 'value', 'selected' при рендеринге формы безуспешно. И я искал документы и Google. Думаю, что-то упускаю! :)

ОБНОВИТЬ

Вот как выглядит мой взгляд. Может в этом проблема?

@mod.route('/q/<slug>/edit', methods = ['GET', 'POST'])
def edit(slug):
    form = QuestionForm(request.form, csrf_enabled=False)
    q = Question.query(Question.slug==slug).get()
    if request.method=='POST':
        if form.validate_on_submit():
            q.question = form.data.get('question')
            q.slug = form.data.get('slug')
            q.active = form.data.get('active')
            q.put()
            return redirect('/questions')
    return render_template('questions/edit.html', form=form, q=q)

person TylerW    schedule 03.11.2013    source источник


Ответы (8)


Если у вас есть объект, вы можете использовать его для заполнения формы, например form = QuestionForm(obj=my_obj). Если вы хотите установить только активный атрибут, используйте form = QuestionForm(active=True).

person snahor    schedule 03.11.2013
comment
Я добавил свое мнение к вопросу. Думаю, я все делаю правильно. Или мне нужно использовать объект 'q' при определении моей формы? Ты это говоришь? - person TylerW; 04.11.2013
comment
Да, используйте свой q объект. form = QuestionForm(request.form, csrf_enabled=False, obj=q) - person snahor; 04.11.2013
comment
Ааааааааааааааааааааааааааааа. Все это имеет смысл сейчас! Ты гений! - person TylerW; 04.11.2013
comment
Это сработало для меня, но только когда я удалил другие биты; form = QuestionForm(formdata=request.form, obj=result) не заполнил флажок, но QuestionForm(obj=result) сделал! - person beep_check; 28.01.2020
comment
Предлагаемое решение у меня сработало: QuestionForm(active=True). В моем случае решение не сработало, поскольку я передавал переменные, а переменная имела тип string, а не bool, из-за чего это решение не работало. Сначала преобразуйте переменную в bool, а затем это решение сработает как шарм. - person Guido; 31.05.2021

Ответ snahor помог после долгих поисков (+1). Google кажется слабым в этом вопросе. Я нашел, что мне нужно

<div class="form-group">
  {{adminForm.is_admin.label}}
  {{adminForm.is_admin(checked=True, class_="form-control")}}
</div>

<div class="form-group">
  {{adminForm.is_admin.label}}
  {{adminForm.is_admin(checked=False, class_="form-control")}}
</div>

который я использовал как

<div class="form-group">
  {{adminForm.is_admin.label}}
  {{adminForm.is_admin(checked=user.is_admin, class_="form-control")}}
</div>
person Matt Stevens    schedule 27.04.2015
comment
Это единственное, что у меня сработало с Flask 0.12 и WTForms 2.1. - person Dan; 01.08.2018

BooleanField определяется как:

checkbox = BooleanField('title',
              default=True,
              render_kw ={'checked':''})
person Mert Bilgiç    schedule 04.04.2020
comment
И default=True, и default="checked" работали у меня. Мне не нужна была часть render_kw, можете ли вы пояснить, зачем она нужна? - person Guido; 27.05.2021
comment
Здравствуйте, насколько я помню, я добавил метку флажка, чтобы флажок был установлен .<input **checked** type="checkbox"> - person Mert Bilgiç; 28.05.2021

Чтобы в качестве логического значения по умолчанию было True, вам необходимо установить значение по умолчанию "отмечено".

Основные поля Основные поля обычно представляют скалярные типы данных с отдельными значениями и относятся к одному входу из формы.

class wtforms.fields.BooleanField(default field arguments, false_values=None)

Представляет тип ввода = "флажок". Установите проверенный статус с помощью опции по умолчанию. Любое значение по умолчанию, например default = "checked" помещает отмеченный в html-элемент и устанавливает для данных значение True

Источник

class QuestionForm(Form):
    question = TextField('Question', [validators.Required()])
    slug = TextField('Slug', [validators.Required()])
    active = BooleanField('Active', default="checked")
person Kevin    schedule 28.07.2018

У меня была та же проблема, и после нескольких часов поиска и чтения решение было очень простым.

form = forms.TestForm(request.form)
form.yourbooleanfield.checked = YourVariable

if request.method=="POST" and form.validate():
    print(form.yourbooleanfield.data)
person Xtian    schedule 30.06.2020

Помимо указания в шаблоне, вы также можете указать в определении класса

class QuestionForm(Form):
    question        = TextField('Question', [validators.Required()])
    slug            = TextField('Slug'    , [validators.Required()])
    activeChecked   = BooleanField('Active', default=True  )
    activeUnChecked = BooleanField('Active', default=False )
person jxramos    schedule 15.07.2017
comment
На меня не действует. Всегда по умолчанию false - person Dan; 01.08.2018

Ни одно из этих решений не помогло мне. Похоже, есть ошибка в WTForms, которая не была исправлена ​​.

Вместо этого при вызове маршрута я устанавливаю значение логического поля после инициализации формы. Это работает для меня

form = GameCreateForm(request.form)
form.allow_comments.data = True
person caspii    schedule 21.05.2020