Django 1.11.4中django-smart-selects 1.5.9联动下拉在Admin中失效求助
Django省市区街道联动下拉失效问题排查与解决
问题背景
在Django 1.11.4环境中集成django-smart-selects 1.5.9,尝试实现省(Province)、区(District)、市(City)、街道(Ward)的联动下拉选择功能,但联动逻辑未按预期生效。
相关代码配置
models.py
from django.db import models from django.utils.translation import ugettext_lazy as _ from smart_selects.db_fields import ChainedForeignKey class Province(models.Model): name = models.CharField( max_length=30 ) class Meta: verbose_name = _("province") verbose_name_plural = _("provinces") def __str__(self): return self.name class District(models.Model): province = models.ForeignKey( Province, on_delete=models.CASCADE ) name = models.CharField( max_length=50 ) class Meta: verbose_name = _("district") verbose_name_plural = _("districts") def __str__(self): return self.name class City(models.Model): district = models.ForeignKey( District, on_delete=models.CASCADE ) name = models.CharField( max_length=50 ) class Meta: verbose_name = _("city") verbose_name_plural = _("cities") def __str__(self): return self.name class Ward(models.Model): city = models.ForeignKey( City, on_delete=models.CASCADE ) name = models.CharField( max_length=2 ) class Meta: verbose_name = _("ward") verbose_name_plural = _("wards") def __str__(self): return self.name class School(models.Model): # other fields ..... province = models.ForeignKey( Province, on_delete=models.SET_NULL, blank=True, null = True, verbose_name = _("province") ) district = ChainedForeignKey( District, chained_field="province", chained_model_field="province", show_all=False, ) city = ChainedForeignKey( City, chained_field="district", chained_model_field="district", show_all=False, ) ward = ChainedForeignKey( Ward, chained_field="city", chained_model_field="city", show_all=False, )
项目根目录urls.py
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^admin/', include('smart_selects.urls')), ]
admin.py(school应用下)
from django.contrib import admin from .models import School @admin.register(School) class SchoolAdmin(admin.ModelAdmin): inlines = [ServerInline, ServerUpdateInline] list_display = ['school_name', 'school_type','phone', 'province', 'district', 'city', 'ward', ] search_fields = ('school_name','district__name') list_filter = ('school_type', 'district')
问题排查与解决步骤
1. 修正URL匹配顺序
Django的URL按定义顺序匹配,当前配置中admin.site.urls先于smart_selects.urls,导致所有/admin/开头的请求都被Admin拦截,smart_selects的联动API无法正常访问。调整顺序:
urlpatterns = [ url(r'^admin/', include('smart_selects.urls')), url(r'^admin/', admin.site.urls), ]
2. 确认INSTALLED_APPS配置
确保smart_selects已添加到项目settings.py的应用列表中:
INSTALLED_APPS = [ # ... 其他应用 'smart_selects', ]
3. 检查静态文件加载(Admin界面)
django-smart-selects依赖JavaScript实现联动逻辑,若使用自定义Admin模板,需确保模板中包含以下代码,以加载所需JS文件:
{{ form.media }}
默认Admin模板会自动处理,但自定义继承模板时需手动添加。
4. 验证模型关联配置
确认ChainedForeignKey的参数配置无误:
district关联province:chained_field="province"(School模型的字段)、chained_model_field="province"(District模型关联Province的外键),配置正确。city关联district、ward关联city的参数逻辑同上,配置均符合要求。
5. 清除浏览器缓存
浏览器缓存的旧JS文件可能导致联动失效,清除缓存后重新加载Admin页面测试。
内容的提问来源于stack exchange,提问作者Anee Mes
相关产品推荐
相关产品推荐

