我想制作一个音乐库应用,并希望在管理/艺术家页面中链接到该艺术家所有专辑的列表。
模型如下:
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模型的过滤版本。谁能告诉我该怎么做或提出更好的方法?
答案 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)