Django Admin list_display: ссылка на отфильтрованную модель - PullRequest
0 голосов
/ 20 января 2019

Я хочу создать приложение для музыкальной библиотеки, а на странице администратора / исполнителя я хочу сделать ссылку на список со всеми альбомами исполнителя.

Модели выглядят так:

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 для ссылки на отфильтрованную версию модели альбома.Может кто-нибудь сказать мне, как это сделать или предложить лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

У меня точно такая же потребность;вот самый простой способ, который я до сих пор придумал.

В списках администраторов есть 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 все еще работает.

Итак, теперь мы знаем, что единственное, что нам нужно, это передать параметр artist__id__exact = XX, поэтому мы должны добавить для этого столбец с кнопкой.

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

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

С этим у вас все работает.Я надеюсь, что это полезно!

0 голосов
/ 20 января 2019

Вы можете использовать list_display и list_filter в admin.py следующим образом:

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)

Ссылка

...