簡體   English   中英

在 Django 管理員中嵌套內聯?

[英]Nested inlines in the 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,]

這讓用戶添加一個新的 Post 項目,選擇相關的更新,將媒體項目添加到其中,然后點擊保存 - 這很好。 但是沒有辦法在一個地方查看屬於給定更新的所有帖子,這反過來意味着您不能在更新中使用帖子。 對於最終用戶來說,這真的很令人困惑。

幫助?

到目前為止,在 django.contrib.admin 中沒有“內置”方式來嵌套內聯(內聯內聯)。 通過擁有自己的 ModelAdmin 和 InlineModelAdmin 子類來啟用這種功能,可以實現這樣的功能。 請參閱這張票上的補丁http://code.djangoproject.com/ticket/9025以獲取有關如何實現此功能的想法。 您還需要提供自己的模板,這些模板將在頂級內聯和子內聯上進行嵌套迭代。

現在有這個雞蛋可用,它是另一個答案中提到的相關補丁的整理:

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

對於以下數據結構,我已經使用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

我剛剛也遇到了這個問題......似乎這個包含嵌套內聯功能請求的線程( https://code.djangoproject.com/ticket/9025#no2 )已經更新了更多信息。

一個名為“django-super-inline”的定制應用程序已經發布。 更多細節在這里: https ://github.com/BertrandBordage/django-super-inlines

安裝和使用說明如下。

希望這對遇到此問題的人有用。

在此處輸入圖像描述

我遇到了與此類似的問題。 我的方法是制作一個 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]

這不是一個理想的解決方案,但它適用於快速而骯臟的工作。

使用django-nested-admin這是做嵌套內聯的最佳包。

首先,安裝“django-nested-admin”

pip install django-nested-admin

然后,在“ settings.py ”中將“nested_admin”添加到“INSTALLED_APPS ”:

# "settings.py"

INSTALLED_APPS = (
    # ...
    "nested_admin", # Here
)

然后,在"urls.py"中添加"path('_nested_ad...""urlpatterns " :

# "urls.py"

from django.urls import include, path

urlpatterns = [
    # ...
    path('_nested_admin/', include('nested_admin.urls')), # Here
]

最后,在“admin.py”中用“MediaInline()”和“PostInline()”類擴展“NestedTabularInline” ,用“UpdateAdmin()”類擴展“NestedModelAdmin ,如下所示:

# "admin.py"

from .models import Media, Post, Update
from nested_admin import NestedTabularInline, NestedModelAdmin

class MediaInline(NestedTabularInline):
    model = Media

class PostInline(NestedTabularInline):
    model = Post
    inlines = [MediaInline]

@admin.register(Update)
class UpdateAdmin(NestedModelAdmin):
    inlines = [PostInline]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM