将BooleanField预先填充为已选中(WTForms)

时间:2013-11-03 21:04:26

标签: python flask wtforms

对于我的生活,我无法弄清楚如何使用WTForms预填充BooleanField。我有一个名为“活跃”的字段。它默认为未选中,并且不是必需的。所以我把它设置成......

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'属性。如果错,不要。但我甚至无法弄清楚如何使复选框具有检查状态,在渲染表单时,更不用说条件部分了。

唯一的方法是,我能够让它显示检查是否在定义表单时添加default = True。但那不是我需要的。

我尝试使用'default','initial','value','selected',同时渲染表单没有运气。我搜索了文档和谷歌。我想我错过了什么! :)

更新

这是我的观点。也许是问题?

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

8 个答案:

答案 0 :(得分:7)

如果您有对象,可以使用它来填充表单,如form = QuestionForm(obj=my_obj)。如果您只想设置活动属性,请使用form = QuestionForm(active=True)

答案 1 :(得分:6)

经过多次搜索后,snahor的回答得到了帮助(+1)。谷歌似乎在这个问题上很弱。我发现我需要

<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>

答案 2 :(得分:5)

一个BooleanField定义如下:

checkbox = BooleanField('title',
              default=True,
              render_kw ={'checked':''})

答案 3 :(得分:1)

我遇到了同样的问题,经过数小时的搜索和阅读,解决方案非常简单。

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

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

答案 4 :(得分:0)

除了在模板中指定外,您还可以在类定义中指定

class QuestionForm(Form):
    question        = TextField('Question', [validators.Required()])
    slug            = TextField('Slug'    , [validators.Required()])
    activeChecked   = BooleanField('Active', default=True  )
    activeUnChecked = BooleanField('Active', default=False )

答案 5 :(得分:0)

要将默认布尔值设置为True,您需要将默认值设置为“选中”

  

基本字段基本字段通常表示标量数据类型,其中   单个值,并引用表单中的单个输入。

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

代表输入类型=“复选框”。设置   使用默认选项检查状态。任何默认值,   例如default =“ checked”将选中的内容放入html-element并设置   数据保存为True

Source

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

答案 6 :(得分:0)

这些解决方案都不适合我。似乎有一个bug in WTForms that has not been fixed

相反,当路由被调用时,我在初始化表单后设置了布尔字段的值。这对我有用

form = GameCreateForm(request.form)
form.allow_comments.data = True

答案 7 :(得分:0)

这对我有用

BooleanField(default="checked")

https://wtforms.readthedocs.io/en/2.3.x/fields/

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