Как я могу связать (соединить) два выпадающих списка в админке django
Нравится: Есть три выпадающих списка: Country
, Province
и District
.
- Country: When I click on Country dropdown it'll display all the countries. And I'll choose one.
- 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.
- 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. Это может быть больше усилий, чем оправдано для пользовательского интерфейса администратора.