Rob L
Rob L

Reputation: 3734

Django Multiple Nested inline formsets

Is this even possible?

I need to store some documents to be retrieved as json/rest.

A Document has many Sections, and a section has a heading, a body and many Images.

Is there a way I can make a form with this structure?

Publication
|-- Section
    |-- Image
    |-- Image
|-- Section
    |-- Image
|-- Section
    |-- Image
    |-- Image
    |-- Image

My models:

class Publication(models.Model):
    title = models.CharField(max_length=64)

class Section(models.Model):
    publication = models.ForeignKey(Publication)
    heading = models.CharField(max_length=128)
    body = models.TextField()

class Image(models.Model):
    section = models.ForeignKey(Section)
    image = models.ImageField(upload_to='images/')
    caption = models.CharField(max_length=64, blank=True)
    alt_text = models.CharField(max_length=64)

I can do this relatively easy when Image is related to Publication, because there is only one level of nesting.

When Image is belongs to Section, though, I'm not sure how to build the form. It seems as though there's no easy way to do this with inline formsets.

Can anyone help?

Upvotes: 5

Views: 6692

Answers (1)

hellsgate
hellsgate

Reputation: 6005

This can't be done in vanilla Django. I use django-nested-inlines for this and it works really well.

from django.contrib import admin
from nested_inlines.admin import NestedModelAdmin, NestedTabularInline

from my.models import Publication, Section, Image


class ImageInline(NestedTabularInline):
    model = Image


class SectionInline(NestedTabularInline):
    model = Section
    inlines = [ImageInline,]


class PublicationAdmin(NestedModelAdmin):
    inlines = [SectionInline,]


admin.site.register(Publication, PublicationAdmin)

Upvotes: 6

Related Questions