Здравствуйте!
Тренируюсь в 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
Насколько это "грязный хак" и стоит ли так делать?