2010-09-09 5 views
30

Хорошо, у меня довольно простой дизайн.Вложенные строки в администраторе 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,] 

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

Помощь?

+7

Я думаю, было бы проще создать для вас собственный взгляд и подключить его к администратору Django и сверкайте его чертой JavaScript, чтобы сделать вещи более динамичными. –

+0

Хм, я не совсем уверен, как это сработает. Любой пример, на который вы можете указать? :) –

ответ

14

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

+9

Неужели это все-таки современное состояние джанго? – andi

+0

@andi Билет был назначен На данный момент https://pypi.python.org/pypi/django-nested-admin –

2

У меня возникла аналогичная проблема. Мой подход состоял в том, чтобы сделать 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] 

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

+4

вам понадобится дополнительный ForeignKey для работы – Tom

5

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

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

+0

работает ли он на django 1.8? последняя фиксация в 2013 году –

+0

на данный момент, она не поддерживает python 3 –

3

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

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

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

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

enter image description here

1

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

  • конкурса
    • судьи
    • конкурсанты
      • Singers
      • Песни

Мой 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)

Смежные вопросы