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

Django表单字段联动过滤:按车辆品牌筛选车型可行吗?

如何实现选择车辆品牌后自动过滤关联车型?

要实现选择品牌后实时过滤车型下拉框的效果,需要结合Django后端提供数据接口,再配合前端JavaScript实现交互——纯Django后端无法完成前端实时联动,必须用到JS。以下是具体实现方案:

实现步骤

1. 后端新增车型数据接口

在views.py中添加视图函数,接收品牌ID,返回对应品牌的车型列表:

from django.http import JsonResponse
from .models import CarModel

def get_car_models(request):
    brand_id = request.GET.get('brand_id')
    # 注意:根据你的CarModel实际字段调整显示内容,这里假设用name字段
    car_models = CarModel.objects.filter(car_brand_id=brand_id).values('id', 'name')
    return JsonResponse(list(car_models), safe=False)

在urls.py中配置接口路由:

from django.urls import path
from .views import get_car_models

urlpatterns = [
    # 其他路由...
    path('api/car-models/', get_car_models, name='get_car_models'),
]

2. 模板中添加JS联动逻辑

修改模板代码,添加JavaScript监听品牌选择事件,请求接口更新车型下拉框:

<div class="mb-3">
    {{ form.vehicle_brand|label_with_classes:"form-label" }}
    {{ form.vehicle_brand }}
</div>
<div class="mb-3">
    {{ form.car_model|label_with_classes:"form-label" }}
    {{ form.car_model }}
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const brandSelect = document.getElementById('id_vehicle_brand');
    const modelSelect = document.getElementById('id_car_model');

    // 页面加载时,若已有默认品牌则自动加载对应车型(编辑场景适用)
    if (brandSelect.value) {
        loadCarModels(brandSelect.value);
    }

    // 监听品牌选择变化
    brandSelect.addEventListener('change', function() {
        loadCarModels(this.value);
    });

    function loadCarModels(brandId) {
        // 清空现有车型选项
        modelSelect.innerHTML = '<option value="">请选择车型</option>';
        
        if (!brandId) return;

        // 请求后端接口获取车型数据
        fetch(`/api/car-models/?brand_id=${brandId}`)
            .then(res => res.json())
            .then(data => {
                data.forEach(model => {
                    const option = document.createElement('option');
                    option.value = model.id;
                    option.textContent = model.name; // 对应后端返回的字段
                    modelSelect.appendChild(option);
                });
            })
            .catch(err => console.error('加载车型失败:', err));
    }
});
</script>

注意:id_vehicle_brand和id_car_model是Django表单自动生成的控件ID,若你自定义了widget的ID,需对应修改;同时确保CarModel的显示字段(示例中用name)与你的模型定义一致。

3. 可选:表单验证(后端兜底)

为避免前端绕过JS提交无效数据,可在表单的clean方法中添加验证:

class VehicleForm(forms.ModelForm):
    # 你的表单字段定义...

    def clean(self):
        cleaned_data = super().clean()
        brand = cleaned_data.get('vehicle_brand')
        model = cleaned_data.get('car_model')
        
        if brand and model and model.car_brand != brand:
            raise forms.ValidationError("所选车型不属于该品牌")
        
        return cleaned_data

关键说明

  • 纯Django后端只能在表单提交时做校验,无法实现前端实时联动,必须依赖JS完成交互逻辑;
  • 接口实现用普通Django视图即可,无需引入REST Framework,满足轻量需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:20:25