DjangoAdmin как реализовать зависимый выбор в list_filter?

Здравствуйте!
Тренируюсь в Django 1.8. Есть следующая модель в приложении address:
class City(models.Model):
    name = models.CharField("город", unique=True, max_length=30)


class Street(models.Model):
    name = models.CharField("улица", max_length=50)
    city = models.ForeignKey(City, verbose_name="город")


В админке сделал фильтры по городу и улице:
class AddressAdmin(admin.ModelAdmin):
    list_filter = ['address__street__city__name', 'address__street__name']


Как сделать так, чтобы при выборе города в списке улиц отображались только улицы выбранного города? В текущем варианте отображаются все города и все улицы во всех городах.
Документацию смотрел, встроенного решения пока не нашел.

UPD:
Спасибо за совет, сделал примерно так:
class StreetListFilter(admin.SimpleListFilter):
    title = 'улицы'
    parameter_name = 'street'

    def lookups(self, request, model_admin):  # будем выводить улицы только выбранного города
        city_name = request.GET.get('address__street__city__name')
        streets_list = list()
        if city_name:
            streets = Street.objects.filter(city__name=city_name)  # получаем названия всех улиц города
            for i in streets:
                streets_list.append((i.get_name(), i.get_name()))
            return streets_list

    def queryset(self, request, queryset):
        if self.value():
            city_name = request.GET.get('address__street__city__name')
            city = City.objects.get(name=city_name)
            return queryset.filter(address__street=Street.objects.get(name=self.value(), city=city))


class AddressAdmin(admin.ModelAdmin):
    list_filter = ['address__street__city__name', StreetListFilter]


Остался, правда вопрос, как убрать из параметров GET выбранную ранее улицу, при выборе другого города

UPD2:
К последнему вопросу, решил так:
в lookups добавил небольшую конструкцию:

def lookups(self, request, model_admin):  # будем выводить улицы только выбранного города
        city_name = request.GET.get('address__street__city__name')
        streets_list = list()
        if city_name != request.session.get('stored_city_name'):  # new ###########
            self.used_parameters[self.parameter_name] = None  ##### new ###########
            request.session['stored_city_name'] = city_name  ###### new ###########
        if city_name:
            streets = Street.objects.filter(city__name=city_name)  # получаем названия всех улиц города
            for i in streets:
                streets_list.append((i.get_name(), i.get_name()))
            return streets_list


Насколько это "грязный хак" и стоит ли так делать?
  • Вопрос задан
  • 641 просмотр
Решения вопроса 1
crazyzubr
@crazyzubr
Python backend-developer
А это смотрели в документации?
https://docs.djangoproject.com/en/1.8/ref/contrib/...

Наследуйтесь от SimpleListFilter и в нужных методах делайте свою выборку в зависимости от того, что передается в GET
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы