在 Django 管理员中嵌套内联?

Posted

技术标签:

【中文标题】在 Django 管理员中嵌套内联?【英文标题】:Nested inlines in the Django admin? 【发布时间】:2011-04-10 12:33:44 【问题描述】:

好的,我有一个相当简单的设计。

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

这让用户添加一个新的帖子项目,选择相关的更新,将媒体项目添加到其中,然后点击保存 - 这很好。但是没有办法在一个地方查看属于给定更新的所有帖子,这反过来意味着您不能在更新中使用帖子。对于最终用户来说,这真的很令人困惑。

帮助?

【问题讨论】:

我认为最简单的方法是为此构建自己的视图并将其插入 Django admin 并使用少量 javascript 使其更加动态化。 嗯,我不太确定这将如何工作。您可以指出任何例子吗? :) 【参考方案1】:

现在有这个鸡蛋可用,它是另一个答案中提到的相关补丁的整理:

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

【讨论】:

它适用于 django 1.8 吗?最后一次提交是在 2013 年 目前还不支持python 3【参考方案2】:

我已使用https://github.com/theatlantic/django-nested-admin 完成此操作,用于以下数据结构:

比赛 法官 参赛者 歌手 歌曲

我的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 似乎比已经提到的其他应用程序(https://github.com/BertrandBordage/django-super-inlines 和 https://github.com/Soaa-/django-nested-inlines)得到更积极的维护

【讨论】:

extra = 0 是什么意思? 好的,这是一个显示 n 个空行的设置,以便可以添加新项目。对于 0 个空行,您必须单击“添加另一个...关系”按钮。很抱歉收到垃圾邮件。【参考方案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】:

到目前为止,在 django.contrib.admin 中没有“内置”方式来嵌套内联(内联内联)。通过拥有自己的 ModelAdmin 和 InlineModelAdmin 子类来启用这种功能,可以实现这样的功能。请参阅这张票上的补丁 http://code.djangoproject.com/ticket/9025 以获取有关如何实现此功能的想法。您还需要提供自己的模板,这些模板将在***内联和子内联上进行嵌套迭代。

【讨论】:

它仍然是 django 的最新状态吗? @andi 票已经分配到现在pypi.python.org/pypi/django-nested-admin

以上是关于在 Django 管理员中嵌套内联?的主要内容,如果未能解决你的问题,请参考以下文章

Django 嵌套内联 TemplateDoesNotExist

在 django admin 中为内联项目添加完整更改表单的链接?

如何在嵌套管理员中执行内联编辑?

Django Admin:访问内联管理员中的父实例

Django 中的内联表单验证

如何在管理界面中内联编辑 django 用户配置文件?