Django Admin list_display: ссылка на отфильтрованную модель

Я добавил в свой app / assets / application.js следующий код javascript, чтобы переписать URL-адрес на весь сайт.

$(document).ready(function () {
  if (window.location.href.indexOf('#') > 0) {
    window.location = window.location.href.replace(/#/, '?');
  }
});
1
задан Benyamin Jafari 22 January 2019 в 05:40
поделиться

2 ответа

Вы можете использовать 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)

[115 ] В работе

0
ответ дан Khashayar Ghamati 22 January 2019 в 05:40
поделиться

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

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

Я надеюсь, что это полезно!

0
ответ дан Pere Picornell 22 January 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: