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

如何在forms.Form的ModelChoiceField中设置关联州的城镇查询集?

实现州与城镇的联动下拉框

要搞定选州后自动过滤对应城镇的联动效果,得结合后端数据接口和前端动态更新,具体步骤如下:

1. 调整表单初始设置

先把城镇下拉框的初始数据设为空,因为一开始没选州,没必要加载所有城镇:

# forms.py
class Location(forms.Form):
    state = forms.ModelChoiceField(
        required=True,
        label="State",
        queryset=State.objects.all(),
        widget=forms.Select(attrs={"class": "form-list-field"})
    )
    town = forms.ModelChoiceField(
        required=True,
        label="Town",
        queryset=Town.objects.none(),  # 初始空数据
        widget=forms.Select(attrs={"class": "form-list-field"})
    )

2. 写后端数据接口

加个视图函数,接收选中的州ID,返回该州下属的城镇列表:

# views.py
from django.http import JsonResponse
from .models import Town

def get_towns_by_state(request):
    state_id = request.GET.get('state_id')
    towns = Town.objects.filter(state_id=state_id).order_by('town')
    # 转成前端能用的格式
    town_list = [{'id': town.id, 'name': str(town)} for town in towns]
    return JsonResponse({'towns': town_list})

3. 配置接口路由

在urls.py里给上面的视图加个路由:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 你的其他路由...
    path('towns-by-state/', views.get_towns_by_state, name='get_towns'),
]

4. 前端AJAX实现联动

在表单所在的模板里加JS代码,监听州下拉框的变化,动态更新城镇选项:

<!-- 模板文件 -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script>
$(function() {
    // 监听州选择框的变化事件
    $('#id_state').on('change', function() {
        const stateId = $(this).val();
        if (stateId) {
            // 发请求拿对应城镇
            $.get('{% url "get_towns" %}', {state_id: stateId}, function(data) {
                // 清空城镇下拉框
                const townSelect = $('#id_town');
                townSelect.empty();
                // 挨个加选项
                data.towns.forEach(town => {
                    townSelect.append(`<option value="${town.id}">${town.name}</option>`);
                });
            });
        } else {
            // 没选州的话清空城镇框
            $('#id_town').empty();
        }
    });
});
</script>

补充说明

  • 如果你用的是ModelForm,逻辑完全一样,只是表单继承forms.ModelForm就行
  • Django默认给表单元素生成的ID是id_字段名,比如state字段对应id_state,别写错了
  • 不想用jQuery的话,用原生JS写AJAX也可以,逻辑都是先拿州ID、请求接口、更新选项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:15:31