Django管理员中的嵌套内联?

37 投票
6 回答
31186 浏览
提问于 2025-04-16 03:56

好的,我有一个比较简单的设计。

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

这样用户就可以添加一个新的帖子,选择相关的更新,添加媒体项,然后点击保存——这没问题。但是,用户无法在一个地方看到属于某个更新的所有帖子,这样就无法在更新中重新排序帖子。这对最终用户来说真的很困惑。

有人能帮忙吗?

6 个回答

6

我使用了这个链接中的工具: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-inlineshttps://github.com/Soaa-/django-nested-inlines)更新得更频繁。

8

现在有一个新的软件包可以使用,它包含了之前回答中提到的相关修复程序:

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

21

目前,在django.contrib.admin中没有“内置”的方法可以实现嵌套的内联(也就是在一个内联里面再放一个内联)。不过,你可以通过创建自己的ModelAdmin和InlineModelAdmin子类来实现这种功能。想要了解如何实现,可以参考这个链接上的补丁信息:http://code.djangoproject.com/ticket/9025。此外,你还需要提供自己的模板,以便能够对顶层内联及其子内联进行嵌套遍历。

撰写回答