【问题标题】:Hiding a form-group with Flask Jinja2 and WTForms使用 Flask Jinja2 和 WTForms 隐藏表单组
【发布时间】:2015-01-20 04:25:56
【问题描述】:

我正在尝试根据表单另一部分中复选框的状态来显示或隐藏表单字段。我认为我可以使用 jQuery .show() 或 .hide() 相对轻松地做到这一点,但到目前为止我运气不佳。有什么想法吗?

表单类:

class MyForm(Form):
    checked = BooleanField('Check this box:')
    date = DateField('Date:', format='%Y-%m-%d', id="dates")
    submit = SubmitField('Submit')

模板:

{% import "bootstrap/wtf.html" as wtf %}

{% block content %}

{{ form.hidden_tag() }}
{{ wtf.form_field(form.checked) }}
{{ wtf.form_field(form.date) }}
{{ wtf.form_field(form.submit) }}

{% endblock %}

{% block scripts %}

<script type="text/javascript">
jQuery(document).ready(function() {
  $("#checked").change(function() {
    if(this.checked) {
        $('#dates').show();
    } else {
      $('#dates').hide();
    }
  });
});
</script>

{% endblock %}

【问题讨论】:

    标签: jquery flask jinja2 flask-wtforms


    【解决方案1】:

    您似乎在使用Flask-Bootstrap

    首先,确保在模板中包含 {% extends 'bootstrap/base.html' %}。如果没有这条线,您将失去 Flask-Bootstrap 包含在模板中的所有内容,例如 jQuery。

    其次,您将覆盖 scripts 块。这是 Flask-Bootstrap 包含 jQuery 的地方。为了在不丢失基本版本的情况下将自己的东西放在那里,您需要使用Jinja's super function。它将包含父模板的 scripts 块以及您自己的块。

    进行这些更改后,您的模板应该看起来像

    {% extends 'bootstrap/base.html' %}
    
    {% import "bootstrap/wtf.html" as wtf %}
    
    {% block content %}
        <form>
            {{ form.hidden_tag() }}
            {{ wtf.form_field(form.checked) }}
            {{ wtf.form_field(form.date) }}
            {{ wtf.form_field(form.submit) }}
        </form>
    {% endblock %}
    
    {% block scripts %}
        {{ super() }}
    
        <script>
            jQuery(document).ready(function() {
                $("#checked").change(function() {
                    if (this.checked) {
                        $('#dates').show();
                    } else {
                        $('#dates').hide();
                    }
                });
            });
        </script>
    {% endblock %}
    

    【讨论】:

    • {% extends 'bootstrap/base.html' %} 包含在我的布局中。在添加引导程序之前,我将 jquery 包含在静态目录中,所以我知道 jquery 正在加载。 console.log()s 也告诉我脚本正在执行。它只是不切换日期表单组。
    • 将 jQuery 放在您的 static 文件夹中不会将其添加到页面中。如果不将其包含在模板中,则不会包含它。切换使用您的表单和我修改过的模板版本。既然您提到了一些示例中没有的内容,那么您的实际模板是什么样的?
    • 你是对的。看起来这是使用{{ super() }} 的问题。我很困惑,因为我没有得到 jQuery is undefined 错误。
    • 我知道这是一个非常老的问题,但我将这种方法与 BooleanField 对象一起使用,虽然它可以隐藏复选框部分,但似乎出于某种原因离开了标签。跨度>
    • @Brendan 自撰写此答案以来的近 6 年半中可能发生了很多变化。你最好问一个新问题。你总是可以从中引用这个。我已经好几年没用过 Flask-WTF 了,但我的猜测是尝试通过 label=“”
    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多