如何在Django管理面板中列出所有与外键相关的对象?

2024-09-22 14:29:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用django管理面板实现一个非常简单的特性,但是到目前为止,我还没有找到实现这一点的正确方法:

模型.py

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

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

管理.py

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

如何向“作者列表”概述中的每个项目(作者)添加指向显示特定作者的所有书籍的视图的链接?例如:

  • J、 K.罗琳(书籍)
  • J、 R.R.托尔金(书籍)

其中books是指向显示作者所有书籍的网站的超链接。


Tags: django方法py面板modeladminmodels作者
3条回答

它并不像你想象的那么简单,可能,但也不是微不足道的,因为没有那么多关于这个特性的文档:)

您需要的是一个自定义列,该列由一个函数生成,该函数为您提供一个指向具有给定筛选器的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]

你在找一个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 suggestion在Author list_显示中添加链接。此链接指向按作者筛选的图书列表:

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

免责声明:未经测试,但如果你修复了错别字,它会工作!:)

注意,这些链接也可以在管理中的其他点注入。将其添加到小部件时,可以从“更改视图”转到“更改视图”。

研究如何实现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

相关问题 更多 >