Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested inlines in the Django admin?

Alright, I have a fairly simple design.

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')

Is there an easy-ish way to allow a user to create an update all on one page?

What I want is for a user to be able to go to the admin interface, add a new Update, and then while editing an Update add one or more Posts, with each Post having one or more Media items. In addition, I want the user to be able to reorder Posts within an update.

My current attempt has the following in admin.py:

class MediaInline(admin.StackedInline):
    model = Media

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

This let's the user add a new Post item, select the relevant Update, add the Media items to it, and hit save - which is fine. But there's no way to see all the Posts that belong to a given Update in a single place, which in turn means you can't roderder Posts within an update. It's really quite confusing for the end user.

Help?

like image 271
Cody Hatch Avatar asked Sep 09 '10 23:09

Cody Hatch


People also ask

How do I use nested admin in Django?

First we install a package using pip: pip install django-nested-admin. Now we Add the library in settings.py: INSTALLED_APPS[ ... 'nested_admin', ... ]

What is Django-nested-admin?

django-nested-admin is a project that makes it possible to nest admin inlines (that is, to define inlines on InlineModelAdmin classes). It is compatible with Django 1.11+ and Python versions 2.7 and 3.4+ and works with or without Grappelli.

What we can do in admin portal in Django?

Overview. The Django admin application can use your models to automatically build a site area that you can use to create, view, update, and delete records. This can save you a lot of time during development, making it very easy to test your models and get a feel for whether you have the right data.


4 Answers

As of now there is no "built-in" way to have nested inlines (inline inside inline) in django.contrib.admin. Pulling something like this off is possible by having your own ModelAdmin and InlineModelAdmin subclasses that would enable this kind of functionality. See the patches on this ticket http://code.djangoproject.com/ticket/9025 for ideas on how to implement this. You'd also need to provide your own templates that would have nested iteration over both the top level inline and it's child inline.

like image 60
Vasil Avatar answered Oct 16 '22 14:10

Vasil


There is now this egg available, which is a collation of the relevant patches mentioned in the other answer:

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

like image 32
GreenAsJade Avatar answered Oct 16 '22 13:10

GreenAsJade


I have done this using https://github.com/theatlantic/django-nested-admin, for the following Data structure:

  • Contest
    • Judges
    • Contestants
      • Singers
      • Songs

My admin.pyfile:

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 appears to be much more actively maintained than the other apps already mentioned (https://github.com/BertrandBordage/django-super-inlines and https://github.com/Soaa-/django-nested-inlines)

like image 6
Li-Wen Yip Avatar answered Oct 16 '22 14:10

Li-Wen Yip


I have just ran into this issue as well... Seems this thread which contains the request for the nested inlines feature (https://code.djangoproject.com/ticket/9025#no2) has been updated with further information.

A custom made app called "django-super-inline" has been released. More details here: https://github.com/BertrandBordage/django-super-inlines

Installation and usage instructions below.

Hope this is useful for whomever comes across this.

enter image description here

like image 3
Aivoric Avatar answered Oct 16 '22 14:10

Aivoric