desperadik
@desperadik
Истина где-то рядом.

Как сделать кастомный list_display в админке django?

Утро доброе!
Например, имеются модели:
models.py
class Library(models.Model):
    title = models.CharField()
    cover = models.ImageField()
    description = models.TextField()


class Book(models.Model):
    material = models.ForeignKey(Library)
    user = models.ForeignKey(User)


Как в админке в листинге модели Library вывести отдельной колонкой Book?

я понимаю, что нужно что-то вроде этого:
admin.py
class LibraryAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'get_book', )
    model = Library

    def __init__(self, *args, **kwargs):
        super(LibraryAdmin, self).__init__(*args, **kwargs)
        self.list_display_links = ('id', 'get_book')


А в модели Library как, точнее как осуществить обратную связь??.
models.py.Library
class Library(models.Model):
    title = models.CharField()
    cover = models.ImageField()
    description = models.TextField()

    def get_book(self):
        if self.book: # Как тут осуществить обратную связь?
            return self.book
        else:
           return None
    get_book.short_description = "Книга"

class Book(models.Model):
    material = models.ForeignKey(Library)
    user = models.ForeignKey(User)
  • Вопрос задан
  • 3200 просмотров
Пригласить эксперта
Ответы на вопрос 1
По-моему, у вас одному экземпляру Library может соответствовать более одного экземпляра Book? Почему тогда написано "книга", а не "книги"?

У всякого экземпляра Library есть свойство book_set, которое содержит список всех книг, соответствующих данному объекту. Можно переименовать его, указав related_name:

material = models.ForeignKey(Library, related_name='books')


Теперь вы можете вывести список книг так:

class LibraryAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'book_list', )

    def book_list(self, obj):
        return ', '.join(book.name for book in self.books)


Или у вас одна библиотека соответствует только одной книге, и наоборот?
Ответ написан
Ваш ответ на вопрос

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

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