@lopatin_ay

Как сделать вложенные ForeignKey в админке?

Здравствуйте, пытаюсь сделать аналог книги, вот как выглядит модель: Книга -> Подраздел -> Параграф
models.py
# Раздел книги: Механика, Молекулярная, Электричество...
class Book(models.Model):
    book_title = models.CharField(max_length=64, blank=True, null=True)
    book_text = models.TextField()
    
    def __str__(self):
        return self.book_title


# Подраздел книги: Кинематика, Динамика, Статика...
class Section(models.Model):
    section_title = models.CharField(max_length=128, blank=True, null=True)
    section_text = models.TextField()
    section_book = models.ForeignKey(Book)
    
    def __str__(self):
        return self.section_title


# Параграф подраздела: Перемещение, Путь и т.д.
class Paragraph(models.Model):
    paragraph_title = models.CharField(max_length=256, blank=True, null=True)
    paragraph_text = models.TextField()
    paragraph_date = models.DateTimeField()
    paragraph_section = models.ForeignKey(Section)
    
    def __str__(self):
        return self.paragraph_title


На главной странице админки соответственно отображаются разделы: Books, Sections, Paragraph. Зайдя в Books я добавляю новые книги, зайдя в Sections я добавляю новый раздел с привязкой к книге (Books) и Paragraph с привязкой к Sections (разделу).

Лично мне такой подход не очень нравится, поскольку при тех же 20 параграфах уже можно запутаться, к какому разделу он относиться и к какой книге. Я хочу сделать следующее: В разделе Books (какой-то книги, допустим, Механика) должен выводиться просто список Sections (которые соответствуют данной книге: Кинематика, Динамика...) и выбрав нужный нам Sections мы попадаем на аналогичную страницу только теперь мы видим список параграфов. Надеюсь не запутанно объяснил :)
Если наглядно, то чтобы добраться до редактирования/добавления нового параграфа мы должны проделать такой путь Books -> Sections -> Paragraph.

Можно ли это сделать стандартными средствами админки django или может воспользоваться другими решениями?
  • Вопрос задан
  • 316 просмотров
Пригласить эксперта
Ответы на вопрос 2
@IvanOne
Вот пример, есть модель операций, и к ней цепляется модели даты проведения операции, в админке выглядит так:
class OperationDateInline(admin.TabularInline):
    model = OperationDate

@admin.register(Operation)
class OperationAdmin(admin.ModelAdmin):
    inlines = [OperationDateInline, ]

Это самый простой метод использования, там еще куча настроек есть, StackedInline и TabularInline Разница между ними только в используемом шаблоне.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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