Вложенные строки в администраторе 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,]
Это позволит пользователю добавить новый элемент сообщения, выбрать соответствующее обновление, добавить к нему элементы мультимедиа и нажать "Сохранить" - это нормально. Но нет никакого способа увидеть все сообщения, принадлежащие данному обновлению, в одном месте, что, в свою очередь, означает, что вы не можете отправлять сообщения в обновлении. Это действительно запутывает для конечного пользователя.
Справка
Ответы
Ответ 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)