Django Admin list_display:链接到过滤模型

时间:2019-01-20 00:31:31

标签: django django-models foreign-keys django-admin

我想制作一个音乐库应用,并希望在管理/艺术家页面中链接到该艺术家所有专辑的列表。

模型如下:

class Artist(models.Model):
    artistName = models.CharField(max_length=100, blank = False) 
    genre = models.CharField(max_length=100, blank = False) 

    def __str__(self):
        return self.artistName

class Album(models.Model):
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    albumName = models.CharField(max_length=500, blank = False)
    year = models.IntegerField(blank = False)

    def __str__(self):
        return self.albumName

现在进入管理部分,我想我做了一个ArtistAdmin模型,然后以某种方式使用list_display链接到Album模型的过滤版本。谁能告诉我该怎么做或提出更好的方法?

2 个答案:

答案 0 :(得分:2)

我的需求完全相同;这是我到目前为止最简单的方法。

管理员列表具有list_filter,例如,您可以使用它进行操作(假设您注册了管理员类,依此类推):

class AlbumAdmin(admin.ModelAdmin):
list_display = ('artist', 'albumName', 'year',)
list_filter = ('artist',)

这将在管理站点中的右栏添加歌手列表,如果单击一个,专辑列表将被过滤以仅显示该歌手的作品。

有了这个,这就是窍门,结果证明,即使您不声明“ list_filter”,Django仍然会根据URL参数过滤内容。 因此,我激活了过滤器,单击了一位“艺术家”,所以列表被过滤了,我可以看到它是如何格式化URL的,就像 […] / admin / app_name / model_name /?foreignKeyName__id__exact = XX

在您的情况下,我认为它看起来类似于: […] / admin / music_library / album /?artist__id__exact = XX

尝试执行以下步骤,然后删除“ list_filter”行,您将看到该URL仍然有效。

所以现在我们知道,我们唯一需要的是传递param artist__id__exact = XX,因此我们必须为此添加带有按钮的列。

class ArtistAdmin(admin.ModelAdmin):
list_display = ('artistName', 'genre', 'artists_list_field')

def artists_list_field(self, obj):
    return mark_safe(u'<a href="../../%s/%s?artist_id__exact=%d">Albums</a>' % (
        'music_library', 'album', obj.id))

有了这个,您就可以使用它了,但这不是一个好习惯,因为我们正在对URL进行硬编码。代替“ music_library”和“ album”,我们应该动态传递实际的应用程序和型号名称。 这就是我现在正在研究的东西。例如,如果另一个模型在同一个应用程序中(例如您的情况),则应用程序名称如下:

u'<a href="../../%s/%s?artist_id__exact=%d">Albums</a>' % (
        obj._meta.app_label, 'album', obj.id)

我希望它有用!

答案 1 :(得分:0)

您可以像这样在admin.py中使用list_display和list_filter:

class PersonAdmin(admin.ModelAdmin): 

    list_display = ('first_name', 'last_name',)
    list_filter = ('company__name', 'first_name',) # company is a model which has relation to the Person model

然后在admin.py中,应将PersonAdmin添加到模型中:

admin.site.register(Person, PersonAdmin)

Reference