Как я могу создать более одного ModelAdmin для одной и той же модели, каждый из которых настроен по-разному и связан с разными URL-адресами?
Допустим, у меня есть модель Django, которая называется Posts. По умолчанию в административном представлении этой модели перечислены все объекты Post.
Я знаю, что могу настроить список объектов, отображаемых на странице, различными способами, установив переменные, такие как list_display, или переопределив queryset
метод в моем ModelAdmin следующим образом:
class MyPostAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date')
def queryset(self, request):
request_user = request.user
return Post.objects.filter(author=request_user)
admin.site.register(MyPostAdmin, Post)
По умолчанию это будет доступно по URL /admin/myapp/post
. Однако я хотел бы иметь несколько представлений / ModelAdmins одной и той же модели. Например /admin/myapp/post
, список всех объектов сообщений и /admin/myapp/myposts
список всех сообщений, принадлежащих пользователю, и /admin/myapp/draftpost
список всех сообщений, которые еще не были опубликованы. (это всего лишь примеры, мой фактический вариант использования более сложный)
Вы не можете зарегистрировать более одного ModelAdmin для одной и той же модели (это приводит к AlreadyRegistered
исключению). В идеале я хотел бы добиться этого, не помещая все в один класс ModelAdmin и не написав свою собственную функцию 'urls', чтобы возвращать другой набор запросов в зависимости от URL.
Я посмотрел на исходный код Django и вижу, ModelAdmin.changelist_view
что подобные функции могут быть как-то включены в мой urls.py, но я не уверен, как именно это будет работать.
Обновление : я нашел один способ сделать то, что я хочу (см. Ниже), но я все еще хотел бы услышать другие способы сделать это.
источник
Ответ Пола Стоуна абсолютно великолепен! Чтобы добавить, для Django 1.4.5 мне нужно было унаследовать мой пользовательский класс от
admin.ModelAdmin
источник