【问题标题】:Pre-populating a BooleanField as checked (WTForms)预填充 BooleanField 已选中 (WTForms)
【发布时间】:2013-11-14 12:06:19
【问题描述】:

对于我的生活,我无法弄清楚如何使用 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。但这不是我需要的。

我在渲染表单时尝试使用“默认”、“初始”、“值”、“选定”,但没有成功。我搜索了文档和谷歌。我想我错过了什么! :)

更新

这是我的看法。也许是问题所在?

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

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

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

    【讨论】:

    • 我对这个问题添加了我的观点。我认为我做得对。还是在定义表单时需要使用“q”对象?你说的是这个吗?
    • 是的,使用您的 q 对象。 form = QuestionForm(request.form, csrf_enabled=False, obj=q)
    • 啊啊啊啊。现在一切都说得通了!你真是个天才!
    • 这对我有用,但只有当我删除其他位时; form = QuestionForm(formdata=request.form, obj=result) 没有正确填写复选框,但 QuestionForm(obj=result) 填写了!
    • 建议的解决方案对我有用:QuestionForm(active=True)。在我的情况下,解决方案不起作用,因为我正在传递变量并且变量的类型是字符串而不是布尔,导致该解决方案不起作用。首先将变量转换为 bool,然后这个解决方案就可以发挥作用了。
    【解决方案2】:

    经过大量搜索 (+1),snahor 的回答有所帮助。谷歌在这个问题上似乎很弱。我发现我需要

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

    【讨论】:

    • 这是唯一对我有用的 Flask 0.12 和 WTForms 2.1
    • “谷歌在这个问题上似乎很弱。”是的,它破坏了网络。
    【解决方案3】:

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

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

    【讨论】:

    • 对我没有影响。始终默认为 false
    【解决方案4】:

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

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

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

    表示输入类型=“复选框”。设置 使用默认选项检查状态。任何默认值, 例如default="checked" 将检查放入 html 元素并设置 数据为真

    Source

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

    【讨论】:

      【解决方案5】:

      一个 BooleanField 定义如下:

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

      【讨论】:

      • default=Truedefault="checked" 都为我工作。我不需要 render_kw 部分,你能详细说明为什么需要它吗?
      • 你好,我记得我已经为要选中的复选框添加了复选框标签。&lt;input **checked** type="checkbox"&gt;
      【解决方案6】:

      这些解决方案都不适合我。好像有bug in WTForms that has not been fixed

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          这对我有用

          BooleanField(default="checked")
          

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-03
            • 1970-01-01
            • 2018-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-04
            • 2016-06-23
            相关资源
            最近更新 更多