首页 > 解决方案 > 如何在 django admin 中链接(连接)两个下拉菜单

问题描述

喜欢:共有三个下拉菜单:CountryProvinceDistrict

  1. 国家:当我点击国家下拉菜单时,它会显示所有国家。我会选择一个。
  2. 省:当我选择一个国家时,该省会根据国家过滤并显示该所选国家的所有省份。我会选择一个省。
  3. 地区:选择一个省份后,该地区会根据该省内的地区进行过滤。

我希望你得到我。我希望这在 Django admin 中成为可能

标签: djangodjango-admindjango-admin-tools

解决方案


没有额外库的可能解决方案

使用raw_id_fields不会像您描述的那样为您提供选择框,但会打开一个对话框,可以从中搜索并选择该地区。这可以直接使用 Django Admin 而不是其他库。

你没有为你的模型和管理员提供代码,所以我假设一个非常简单的模型结构来说明解决方案。

鉴于这些模型:

class Country(Model):
    name = TextField(...)
    ....

class Province(Model):
    name = TextField(...)
    country = ForeignKey(..., unique=True)
    ....

class District(Model):
    name = TextField(...)
    province = ForeignKey(..., unique=True)
    ....

以及一些使用国家/地区的模型:

class SomeLocation(Model):
    district = ForeignKey(..., unique=True)

我假设你想要一个管理 UI 的这个模型只需要这个district字段,因为它唯一地定义了省和国家。但是对于用户来说,首先选择国家和省份可能会更容易,而不是从庞大的地区列表中进行选择。

假设: 和 的选择countryprovince为了更好的用户体验。

如果您启用管理员SomeLocation

from django.contrib.admin import register, ModelAdmin

@register(District):
class DistrictAdmin(ModelAdmin):
    list_display = ['name', 'province__name', 'province__country__name']
    list_filter = ['province', 'province__country']
    search_fields = ['name', 'province__name', 'province__country__name']

@register(SomeLocation)
class SomeLocationAdmin(ModelAdmin):
    ....
    raw_id_fields = ['district']
    

选择解决方案

您将不得不使用额外的库(如https://pypi.org/project/django-ajax-selects/ )来自定义 Admin,或者编写自己的逻辑,包括 JS。这可能比管理 UI 所需的工作量更大。


推荐阅读