Форум
подписаться на последние сообщения:

Admin + вложеные фильтры

dev_evgen
#
Задача простая, но вот решения в админке я не нашёл. Например есть 3 модельки:

class Country(models.Model):
name = models.CharField(max_length=50)

class City(models.Model):
country= models.ForeignKey(Country)
name = models.CharField(max_length=50)

class Attraction(models.Model):
city = models.ForeignKey(City)
name = models.CharField(max_length=50)

последняя зарегистрирована в админке:

class AttractionAdmin(admin.ModelAdmin):
list_display = ('City', 'Name',)
ordering = ('City', 'Name',)
list_filter = ('City',)
admin.site.register(Attraction, AttractionAdmin)

каким макаром можно выводить страны опираясь на первичный ключ? грубо говоря я хочу:
list_display = ('City.Country', 'City', 'Name',)
или определить в Attraction:
def get_country(self):
return u'%s' % self.city.country.name
и выводить, как list_display = ('get_country', 'City', 'Name',), но увы не даёт. так как это реализовать стандартными свойствами админки? хотелось бы это потом прикрутить в фильтр и ограничивать выборку городов по выбранной стране, но это уже FilterSpec
Share
admin
#
Попробуйте определить def __unicode__ в нужной модели, что бы оно выводило то что вам нужно.
dev_evgen
#
это не решит проблему. если мне нужны и города и страны, то переопределив __unicode__ я смогу получить либо то, либо то.
admin
#
dev_evgen,
а двойное подчёркивание не пробовали? list_display = ('сity__сountry',)
dev_evgen
#
пробывал и не помогло. решил вот так:
def country_name(obj):
return u'%s' % obj.name
country_name.short_description = 'Country'

class AttractionAdmin(admin.ModelAdmin):
list_display = (country_name, 'City', 'Name',)

для фильтра написал наследника FilterSpec ввиду необходимости выводить в dispaly только страны с active = True. теперь собственно вопрос номер 2:
каким макаром можно сделать фильтр по атрибуту в виджете, который генерит <select> для RelatedField? мне например не хочется выводить все города при добавлении объекта, а только те, которые имеют атрибут active = True. главное без костылей на javascript и ajax. в моём случае это очень тормозной вариант.
dev_evgen
#
спас limit_choices_to={'active': True} в свойствах ForeignKey у модели. спасибо за участие.
admin
#
dev_evgen,
Я только понять не могу, почему вы атрибуты с большой буквы пишите в list_display?
dev_evgen
#
привычка объявлять переменные "двугорбым верблюдом". field.name всё равно возвращает lower().