Вложенные строки в админке Django? - PullRequest
31 голосов
/ 10 сентября 2010

Хорошо, у меня довольно простой дизайн.

class Update(models.Model):
    pub_date = models.DateField()
    title = models.CharField(max_length=512)

class Post(models.Model):
    update = models.ForeignKey(Update)
    body = models.TextField()
    order = models.PositiveIntegerField(blank=True)

class Media(models.Model):
    post = models.ForeignKey(Post)
    thumb = models.ImageField(upload_to='frontpage')
    fullImagePath = models.ImageField(upload_to='frontpage')

Есть ли простой способ разрешить пользователю создавать обновления на одной странице?

То, что я хочу , - это чтобы пользователь мог перейти в интерфейс администратора, добавить новое обновление, а затем при редактировании обновления добавить одно или несколько сообщений, при этом каждое сообщение имеет одно или несколько сообщений. СМИ. Кроме того, я хочу, чтобы пользователь мог изменять порядок сообщений в обновлении.

Моя текущая попытка имеет следующее в admin.py:

class MediaInline(admin.StackedInline):
    model = Media

class PostAdmin(admin.ModelAdmin):
    inlines = [MediaInline,]

Это позволяет пользователю добавить новый элемент публикации, выбрать соответствующее обновление, добавить в него элементы мультимедиа и нажать «Сохранить» - это нормально. Но нет возможности увидеть все сообщения, принадлежащие данному обновлению, в одном месте, что, в свою очередь, означает, что вы не можете следить за сообщениями в обновлении. Это действительно довольно запутанно для конечного пользователя.

Помощь

Ответы [ 5 ]

15 голосов
/ 19 сентября 2010

На данный момент не существует «встроенного» способа иметь вложенные inline (inline inside inline) в django.contrib.admin.Вытащить что-то подобное можно, если у вас есть собственные подклассы ModelAdmin и InlineModelAdmin, которые бы включали такую ​​функциональность.Посмотрите патчи на этом билете http://code.djangoproject.com/ticket/9025 для идей о том, как реализовать это.Вам также необходимо предоставить свои собственные шаблоны, которые будут иметь вложенную итерацию как для встроенного верхнего уровня, так и для дочернего.

5 голосов
/ 23 марта 2014

Теперь доступно это яйцо, которое представляет собой набор соответствующих патчей, упомянутых в другом ответе:

https://github.com/theatlantic/django-nested-admin

3 голосов
/ 30 июля 2015

Я только что столкнулся с этой проблемой ... Кажется, этот поток, который содержит запрос для функции вложенных строк (https://code.djangoproject.com/ticket/9025#no2) был обновлен с дополнительной информацией.

Выпущено специальное приложение под названием "django-super-inline". Подробнее здесь: https://github.com/BertrandBordage/django-super-inlines

Инструкции по установке и использованию приведены ниже.

Надеюсь, это полезно для тех, кто с этим сталкивается.

enter image description here

2 голосов
/ 23 мая 2012

Я столкнулся с подобной проблемой к этому.Мой подход состоял в том, чтобы создать UpdateAdmin, который содержал встроенные строки как для мультимедиа, так и для публикации ... он, в основном, просто делал так, чтобы у вас был список всех записей мультимедиа, за которыми следуют все записи в обновлении.

Это не идеальное решение, но оно работает для быстрой и грязной работы.

1 голос
/ 01 мая 2017

Я сделал это, используя https://github.com/theatlantic/django-nested-admin, для следующей структуры данных:

  • Конкурс
    • Судьи
    • Участники
      • Певцы
      • Песни

Мой admin.py файл:

from django.contrib import admin
import nested_admin

from .models import Contest, Contestant, Judge, Song, Singer    

class SongInline(nested_admin.NestedTabularInline):
    model = Song
    extra = 0

class SingerInline(nested_admin.NestedTabularInline):
    model = Singer
    extra = 0

class ContestantInline(nested_admin.NestedTabularInline):
    model = Contestant
    inlines = [SongInline, SingerInline]
    extra = 0

class JudgeInline(nested_admin.NestedTabularInline):
    model = Judge
    extra = 0

class ContestAdmin(nested_admin.NestedModelAdmin):
    model = Contest
    inlines = [ContestantInline, JudgeInline]
    extra = 0

admin.site.register(Contest, ContestAdmin)

https://github.com/theatlantic/django-nested-adminпо-видимому, гораздо активнее поддерживается, чем другие приложения, о которых уже упоминалось (https://github.com/BertrandBordage/django-super-inlines и https://github.com/Soaa-/django-nested-inlines)

...