суббота, 25 мая 2013 г.

Показать название ManyToMany полей в админке Django

Есть у нас модель Collection. Коллекция может быть задействована в нескольких номинациях, поэтому связь здесь ManyToMany.

В админке эта модель будет отображаться так:


 Чтобы колонка появилась, нужно проделать пару шагов...


1. В файл admin.py добавим кастомный метод get_nominations, формирующий из названий номинаций строку, которую нужно будет отображать в колонке "Номинации":

class CollectionAdmin(admin.ModelAdmin):
    # .. иные настройки
    # А вот здесь мы пишем не название поля, а функцию
    list_display = ('title', 'get_nominations', )

2. К классу Collection добавим метод get_nominations():
class Collection(models.Model):
    """
    Коллекция, принимающая участие в конкурсе
    """
    title = models.CharField(max_length=100, verbose_name=u'Название')
    author = models.ManyToManyField(Author, verbose_name=u"Автор")
    nomination = models.ManyToManyField(Nomination, verbose_name=u'Номинация')
    contest = models.ManyToManyField(Contest, verbose_name=u'Конкурс(ы)')
    description = models.TextField(verbose_name=u'Описание коллекции')
    
    def __unicode__(self):
        return self.title

    def get_nominations(self):
        nomination_list = self.nomination.get_query_set()
        nominations_str = ''
        for nomination in nomination_list:
            nominations_str += ', ' + nomination.title
        return nominations_str.lstrip(', ')
    # В админке поле будет называться не get_nomination, а Номинации
    get_nominations.short_description = 'Номинации'
        
    class Meta:
        verbose_name = 'Коллекция'
        verbose_name_plural = 'Коллекции'

Благодаря этому в админке Django модель Коллекция обрела новое поле - "Номинации":


Комментариев нет:

Отправить комментарий