Подтвердить что ты не робот

Вложенные строки в администраторе Django?

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

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,]

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

Справка

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

введите описание изображения здесь

Ответ 4

У меня возникла аналогичная проблема. Мой подход состоял в том, чтобы сделать UpdateAdmin, который содержал встроенные строки для Media и Post... в основном это делает так, чтобы у вас был список всех записей мультимедиа, за которыми следовали все сообщения в обновлении.

class MediaInline(admin.StackedInline):
        model = Media

class PostInline(admin.StackedInline):
        model = Post

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

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

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

Ответ 5

Я сделал это, используя 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)