在 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.py
file:
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