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

如何实现项目选择联动对应公司下拉框(无页面刷新)

解决方案

方案一:前端本地数据联动(适合数据量小的场景)

这种方式无需额外后端接口,提前将项目与公司的关联数据传递到前端,通过JavaScript动态生成对应选项。

1. 后端调整数据传递

在Python后端整理项目与公司的映射关系,一起传递到页面:

# 假设projects和companies是从数据库获取的数据集
project_company_map = {}
for project in projects:
    # 筛选当前项目对应的所有公司
    matched_companies = [comp for comp in companies if comp.destinationindicator == project.name]
    project_company_map[project.name] = matched_companies

# 渲染模板时传入映射关系
return render_template(
    'your_page.html',
    projects=projects,
    project_company_map=project_company_map
)

2. HTML结构调整

保留项目选择框,将公司相关区域拆分固定文本框和选择框,初始均隐藏:

<!-- 项目选择框 -->
<select id="project-select">
    {% for project in projects %}
        <option value="{{ project.name }}">{{ project.name }}</option>
    {% endfor %}
</select>

<!-- ASAS对应的固定不可修改文本框 -->
<div id="fixed-company-area" style="display: none;">
    <input type="text" value="Fa_Test" disabled>
</div>

<!-- 其他项目对应的公司选择框容器 -->
<div id="company-select-area" style="display: none;">
    <select id="company-select"></select>
</div>

3. JQuery动态联动逻辑

监听项目选择框的变化事件,根据选中的项目切换显示区域并生成对应公司选项:

// 将后端传递的映射转成JavaScript对象
const projectCompanyMap = {{ project_company_map|tojson }};

$(document).ready(function() {
    const $projectSelect = $('#project-select');
    const $fixedCompany = $('#fixed-company-area');
    const $companySelectArea = $('#company-select-area');
    const $companySelect = $('#company-select');

    // 监听项目选择变化
    $projectSelect.on('change', function() {
        const selectedProject = $(this).val();

        // 先隐藏所有公司相关区域
        $fixedCompany.hide();
        $companySelectArea.hide();

        if (selectedProject === 'ASAS') {
            // 显示固定文本框
            $fixedCompany.show();
        } else {
            // 显示公司选择框并生成选项
            $companySelectArea.show();
            $companySelect.empty(); // 清空原有选项

            // 从映射中取出对应公司列表,生成下拉选项
            const matchedCompanies = projectCompanyMap[selectedProject];
            if (matchedCompanies && matchedCompanies.length > 0) {
                matchedCompanies.forEach(company => {
                    $companySelect.append(`<option value="${company.name}">${company.name}</option>`);
                });
            }
        }
    });

    // 页面加载时触发一次选择事件,处理默认选中项
    $projectSelect.trigger('change');
});

方案二:后端API动态获取(适合数据量大/需实时更新的场景)

如果公司数据量较大,或者需要实时从数据库获取最新数据,可以通过后端接口动态查询。

1. 后端新增API接口

新增一个接口接收项目名称,返回对应的公司列表:

from flask import jsonify, request

@app.route('/api/get-companies')
def get_companies_by_project():
    project_name = request.args.get('project_name')
    if not project_name:
        return jsonify([])
    
    # 根据项目名称筛选公司(这里替换为你的数据库查询逻辑)
    matched_companies = [
        {"name": comp.name, "id": comp.id} 
        for comp in companies 
        if comp.destinationindicator == project_name
    ]
    return jsonify(matched_companies)

2. 前端JQuery调用接口调整

修改联动逻辑,通过AJAX请求后端接口获取数据:

$(document).ready(function() {
    const $projectSelect = $('#project-select');
    const $fixedCompany = $('#fixed-company-area');
    const $companySelectArea = $('#company-select-area');
    const $companySelect = $('#company-select');

    $projectSelect.on('change', function() {
        const selectedProject = $(this).val();

        $fixedCompany.hide();
        $companySelectArea.hide();

        if (selectedProject === 'ASAS') {
            $fixedCompany.show();
        } else {
            $companySelectArea.show();
            $companySelect.empty();

            // 调用后端API获取对应公司
            $.get('/api/get-companies', {project_name: selectedProject}, function(data) {
                if (data.length > 0) {
                    data.forEach(company => {
                        $companySelect.append(`<option value="${company.id}">${company.name}</option>`);
                    });
                }
            });
        }
    });

    $projectSelect.trigger('change');
});

关键注意点

  • 前端本地方案响应更快,但会增加页面初始加载的数据包大小,适合数据量小的场景。
  • API方案适合数据量大或需要实时更新的场景,每次请求获取最新数据。
  • 使用Jinja的|tojson过滤器可以确保Python对象正确转换为JavaScript可识别的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:37:42