You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jQuery隐藏Django Crispy Forms表单字段时标签未隐藏的求助

解决Django Crispy Forms字段与标签同步隐藏/显示问题

问题描述

需要根据下拉框system_description_1的选项控制表单字段的显示与隐藏:

  • 默认页面加载时隐藏secondary_circulation_pump_model和secondary_circulation_pump_capacity字段及其标签
  • 选择“Direct”选项时保持隐藏
  • 选择“Indirect”选项时显示这些字段和标签

当前仅实现了字段的显示隐藏,对应的表单标签无法同步隐藏,需解决此问题。

问题原因

使用as_crispy_field渲染字段时,Crispy Forms会将每个字段包装在包含标签和输入控件的容器(通常是带form-group类的div,ID格式为div_id_字段名)。原代码仅隐藏了输入框本身,未隐藏整个容器,导致标签仍显示。

解决方案

修改JavaScript逻辑与表单渲染方式

通过字段容器的ID控制整个容器的显示/隐藏,同时修正下拉框选项值与模型定义匹配的问题:

修改后的system_profile.html代码:

{% extends 'base.html' %}
{% load static %}
{% block content %}
{% load crispy_forms_tags %}
<script>
function togglePumpFields() {
    const selectedValue = document.getElementById('id_system_description_1').value;
    // 获取Crispy Forms生成的字段容器
    const pumpModelContainer = document.getElementById('div_id_secondary_circulation_pump_model');
    const pumpCapacityContainer = document.getElementById('div_id_secondary_circulation_pump_capacity');
    
    if (selectedValue === "direct") {
        pumpModelContainer.style.display = 'none';
        pumpCapacityContainer.style.display = 'none';
    } else {
        pumpModelContainer.style.display = 'block';
        pumpCapacityContainer.style.display = 'block';
    }
}

window.onload = function() {
    // 初始隐藏字段容器
    document.getElementById('div_id_secondary_circulation_pump_model').style.display = 'none';
    document.getElementById('div_id_secondary_circulation_pump_capacity').style.display = 'none';
    // 绑定下拉框变更事件
    document.getElementById('id_system_description_1').onchange = togglePumpFields;
};
</script>
<br>
<div class="row">
    <div class="col-md-6">
        <div class="card card-body">
            <p><b>Add/Update System Profile:</b></p>
            <form action="" method="POST">
                {% csrf_token %}
                <!-- 使用Crispy Forms渲染下拉框,避免手动编写的value不匹配问题 -->
                {{ form.system_description_1|as_crispy_field }}
                
                {{ form.name|as_crispy_field }}
                {{ form.secondary_circulation_pump_model|as_crispy_field }}
                {{ form.secondary_circulation_pump_capacity|as_crispy_field }}
                
                <hr>
                <input class="btn btn-sm btn-info" type="submit" name="submit">
            </form>
        </div>
    </div>
</div>
{% endblock %}

关键修改点

  1. 操作字段容器而非输入框:通过div_id_字段名获取Crispy生成的字段容器,控制整个容器的显示/隐藏,实现标签和字段同步。
  2. 修正下拉框值匹配问题:移除手动编写的select,改用{{ form.system_description_1|as_crispy_field }}自动渲染,确保选项值与模型定义的direct/indirect一致,避免表单提交错误。
  3. 优化函数命名:将Hide改为更语义化的togglePumpFields,提升代码可读性。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:10:31