Как я могу связать (соединить) два выпадающих списка в админке django

Нравится: Есть три выпадающих списка: Country, Province и District.

  1. Country: When I click on Country dropdown it'll display all the countries. And I'll choose one.
  2. Province: When I choose a Country, the Province gets filtered according to country and displays all the provinces on that chose country. And I'll choose a province.
  3. District: After choosing a province, the district gets filtered according to the districts inside that province.

Надеюсь, вы меня поняли. Я хочу, чтобы это было возможно в админке Django

Возможное решение без дополнительных либ

Использование 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)

Я предполагаю, что для этой модели, для которой вы хотите создать пользовательский интерфейс администратора, нужно только поле district, потому что оно уникально определяет провинцию и страну. Но для пользователя может быть проще сначала выбрать страну и провинцию, вместо того, чтобы выбирать из огромного списка районов.

Предположение: выбор country и province сделан для улучшения пользовательского опыта.

Если вы включите администратора для 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']
    

Решение с помощью Selects

Вам придется настроить Admin, используя дополнительные библиотеки, такие как https://pypi.org/project/django-ajax-selects/ или написать свою собственную логику, включая JS. Это может быть больше усилий, чем оправдано для пользовательского интерфейса администратора.

Вернуться на верх