8

私は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)

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

  • JK ローリング (書籍)
  • JRRトールキン(本)

ここで、books は著者のすべての本を表示するサイトへのハイパーリンクです。

4

3 に答える 3

9

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 の提案を使用して、Author 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]

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

これらのリンクは、管理画面の他のポイントにも挿入できることに注意してください。ウィジェットに追加すると、変更ビューから変更ビューに移動できます。

于 2013-09-30T15:16:52.667 に答える
8

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
于 2013-09-30T14:15:10.817 に答える
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]
于 2013-09-30T14:14:48.790 に答える