Django管理パネルにすべての外部キー関連オブジェクトを一覧表示するにはどうすればよいですか?

Source python django django-admin

django管理パネルで非常に単純な機能を実装したいのですが、これを実現する正しい方法が今のところ見つかりませんでした。

model.py
class Author(models.Model):
    name = models.CharField()

class Books(models.Model):
    title = models.CharField()
    author = models.ForeignKey(Author)

admin.py
class AuthorAdmin(admin.ModelAdmin):
    pass
admin.site.register(Author, AuthorAdmin)

特定の著者のすべての本を表示するビューにリンクする、著者リストの概要のすべてのアイテム(著者)にハイパーリンクを追加するにはどうすればよいですか?例えば:
  • J.K.ローリング(本)
  • J.R.R.トールキン(本)

  • ここで、booksは、著者のすべての本を表示するサイトへのハイパーリンクです。
    推奨答え
    あなたはModelAdmin.list_filterを探しています。

    管理者の変更リストページの右側のサイドバーでフィルターをアクティブにするには、list_filterを設定します。 listfilterはフィールド名にすることができます。指定するフィールドは、BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey、ManyToManyFieldのいずれかです。次に例を示します。
     # Add a list filter author to BookAdmin.
     # Now you can filter books by author.
     class BookAdmin(ModelAdmin):
        list_filter = ('author', )
    

    これで、@ Wolphの提案を使用して、作成者のlist_displayにリンクを追加できます。このリンクは、著者によってフィルタリングされた書籍リストを指しています。
    # Add hyperlinks to AuthorAdmin.
    # Now you can jump to the book list filtered by autor. 
    class AuthorAdmin(admin.ModelAdmin):
        def authors(self):
            return '<a href="/admin/appname/book/?author__id__exact=%d">%s</a>' % (self.author_id, self.author)
        authors.allow_tags = True
    

    代替。クリックを保存するために、本の変更ビューを直接ポイントすることもできます。
    class Books(models.Model):
        title = models.CharField()
        author = models.ForeignKey(Author)
    
    def get_admin_url(self):
        return "/admin/appname/books/%d/" %self.id
    
    
    class BookAdmin(admin.ModelAdmin):
        def authors(self):
            html = ""
            for obj in Books.objects.filter(author__id_exact=self.id):
                html += '<p><a href="%s">%s</a></p>' %(obj.get_admin_url(), obj.title)
            return html
        authors.allow_tags = True
    
        list_display = ['title', authors]
    

    免責事項:テストされていませんが、タイプミスを修正すれば機能します! :)

    これらのリンクは、管理者の他のポイントにも挿入できることに注意してください。ウィジェットに追加すると、ビューの変更からビューの変更に移動できます。
    その他答え 1
    InlineModelAdminオブジェクトの実装を検討してください。
    # admin.py
    class BooksInline(admin.TabularInline):
        model = Books
    
    class AuthorAdmin(admin.ModelAdmin):
        inlines = [BooksInline]
    

    OPのコメントに応じて編集された回答:
    class AuthorAdmin(admin.ModelAdmin):
        list_display = ['name', 'books_published']
    
        def books_published(self, obj):
            redirect_url = reverse('admin:books_changelist')
            extra = "?author__id__exact=%d" % (obj.id)
            return "<a href='%s'>Books by author</a>" % (redirect_url + extra)
    
        books_published.allow_tags = True
    
    その他答え 2
    実際に考えるほど単純ではなく、可能ですが、この機能に関するドキュメントがそれほど多くないため、簡単ではありません:)

    必要なのは、特定のフィルターを使用してDjango管理者へのリンクを提供する関数によって生成されるカスタム列です。このようなもの(頭のてっぺんからテストされていない)でうまくいくはずです:
    class AuthorAdmin(admin.ModelAdmin):
        def authors(self):
            return '<a href="?author=%d">%s</a>' % (self.author_id, self.author)
        authors.allow_html = True
    
        list_display = ['title', authors]
    

    関連記事

    C#ディクショナリ:値ごとに複数のキー
    libSVMを使用したSVMのデータの不均衡
    複数のサーバーでのFlaskログインはどのように機能しますか
    kivyでグローバルフォントサイズを設定する
    オプションで、Pythonでelseステートメントなしでリストに1つの要素を含めることはできますか?