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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:47:45