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

Django模板中如何根据产品选择动态加载对应参数列表

Django表单联动实现方案

1. 后端调整(视图+API接口)

1.1 新增参数获取API视图

写一个专门的视图函数,接收产品ID并返回对应家族的参数列表:

from django.http import JsonResponse
from .models import Product, Parametro  # 替换为你实际的模型类

def get_product_params(request):
    product_id = request.GET.get('product_id')
    if not product_id:
        return JsonResponse({'params': []})
    try:
        product = Product.objects.get(id=product_id)
        # 根据你的模型关联逻辑调整,这里假设Product关联Family,Family关联Parametro
        params = product.family.parametros.values('id', 'name')  # 返回需要的字段
        return JsonResponse({'params': list(params)})
    except Product.DoesNotExist:
        return JsonResponse({'params': []})

1.2 配置API路由

在应用的urls.py中添加路由:

from django.urls import path
from .views import get_product_params

urlpatterns = [
    # 其他现有路由...
    path('get-product-params/', get_product_params, name='get_product_params'),
]

1.3 原表单视图保持原样

确保渲染两个表单的视图正常工作:

from django.shortcuts import render
from .forms import FormEnvIns, FControlEnvIns

def form_view(request):
    form_env = FormEnvIns()
    form_control = FControlEnvIns()
    return render(request, 'your_template.html', {
        'form_env': form_env,
        'form_control': form_control
    })

2. 前端模板实现联动逻辑

在模板文件中添加JavaScript监听产品选择事件,动态更新参数下拉框:

<form>
    {{ form_env.as_p }}
    {{ form_control.as_p }}
</form>

<script>
// 获取表单元素
const productSelect = document.getElementById('id_product');
const paramSelect = document.getElementById('id_parametro_env_ins');

// 监听产品选择变化
productSelect.addEventListener('change', function() {
    const productId = this.value;
    // 携带CSRF令牌(Django默认要求)
    const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
    
    fetch(`/get-product-params/?product_id=${productId}`, {
        headers: {
            'X-CSRFToken': csrfToken
        }
    })
    .then(response => response.json())
    .then(data => {
        // 清空现有选项
        paramSelect.innerHTML = '<option value="">请选择参数</option>';
        // 插入新参数选项
        data.params.forEach(param => {
            const option = document.createElement('option');
            option.value = param.id;
            option.textContent = param.name;
            paramSelect.appendChild(option);
        });
    })
    .catch(err => console.error('加载参数失败:', err));
});
</script>

3. 关键注意事项

  • 替换模型关联逻辑:根据你实际的Product、Family、Parametro模型关联字段,调整API视图中的查询代码。
  • 核对表单元素ID:如果表单字段的HTML ID不是id_product或id_parametro_env_ins,打开页面查看元素实际ID后替换。
  • 可选优化:添加加载状态提示(比如请求时禁用参数下拉框),提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:42:34