Django管理员的嵌套内联?

时间:2010-09-09 23:17:47

标签: python django django-models django-admin

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

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

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

帮助?

5 个答案:

答案 0 :(得分:15)

到目前为止,没有“内置”方法在django.contrib.admin中嵌套内联(内嵌内联)。通过拥有自己的ModelAdmin和InlineModelAdmin子类来实现这种功能,可以实现这样的功能。有关如何实现此功能的建议,请参阅此故障单http://code.djangoproject.com/ticket/9025上的修补程序。您还需要提供自己的模板,这些模板将在顶级内联和子内联中进行嵌套迭代。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

我刚刚遇到这个问题......似乎这个包含嵌套内联功能(https://code.djangoproject.com/ticket/9025#no2)请求的线程已经更新了更多信息。

一款名为“django-super-inline”的定制应用程序已经发布。更多详情:https://github.com/BertrandBordage/django-super-inlines

下面的安装和使用说明。

希望这对遇到这个问题的人有用。

enter image description here

答案 3 :(得分:2)

我遇到了类似的问题。我的方法是制作一个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]

这不是一个理想的解决方案,但它适用于快速而肮脏的工作。

答案 4 :(得分:1)

对于以下数据结构,我使用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)更加积极地维护了