Повторное использование списка изменений Django за пределами сайта администратора - PullRequest
13 голосов
/ 23 февраля 2010

Таблица изменений в Django действительно крутая - с возможностью поиска, фильтрации, множественного выбора и т. Д.

Я создаю пользовательский бэкэнд для приложения и продолжаю понимать: это именно то, что мне нужно, я должен использовать его снова.

Кто-нибудь имел опыт использования списка изменений вне приложения администратора Django?

То, к чему я пришел в данный момент, выглядит примерно так:

from profile.admin import ProfileAdmin
from django.contrib.admin.sites import AdminSite
from profile.models import Profile
profile_admin = ProfileAdmin(Profile, AdminSite())
return profile_admin.changelist_view(request)

Я хотел бы знать, имел ли кто-либо опыт с этим или может предложить альтернативу.

1 Ответ

9 голосов
/ 08 ноября 2011

ChangeList как класс действительно классный и многофункциональный. Однако трудно использовать вне контекста монолита AdminSite.

Класс ChangeList принимает 12 обязательных __init__() параметров. Одно это число должно вас отвлечь и вдвойне, когда вы поймете, что все они получены от администратора changelist_view(). Несмотря на то, что эти параметры остались прежними со времени Django 1.1, они изменились с 1.0, и это настолько большой внутренний объект Django, что я не буду полагаться на стабильность его интерфейса.

Лучший способ использовать ChangeList - или, в частности, чтобы получить преимущества списка изменений (то, что вам нужно) - это использовать changelist_view() метод. Использование этого, конечно, требует использования / создания подкласса AdminSite. Это стоит сделать или, по крайней мере, попробовать. Похоже, вы уже.

Этот метод принимает параметр request и любит /(?P<app_label>%s)/(?P<model_name>%s)/ в маршруте URL, который указывает на него.

Копаем в коде:

  • ChangeList живет в django.contrib.admin.views.main
  • changelist_view() - это метод django.contrib.admin.options.ModelAdmin

ОБНОВЛЕНИЕ: В Django 1.4 значения ChangeList и changelist_view() изменились путем добавления одного и двух новых параметров соответственно.

...