如何在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
相关产品推荐
相关产品推荐

