Возможно ли создать пользовательский вид администратора без модели позади него
У меня есть объект, который я хочу использовать под admin вместо модели, которая наследует models.Model. Если я сделаю это наследующим models.Model, этот объект создаст таблицу в базе данных, которую я не хочу. Я хочу, чтобы этот объект оставался в памяти.
Одно из решений, которое я получил с помощью приятных людей при переполнении стека, - это создание представлений администратора, регистрация этих пользовательских представлений с помощью modelAdmin (admin.site.register()) под admin.py и использование этого объекта, подобного модели как динамическое хранилище данных (в памяти).
Так как эта модель вроде объекта не наследуется от models.Model, admin.site.register() (под admin.py) не принимает ее и показывает, что ошибка "тип" не является итерируемой "при попытке доступа это в браузере.
Ответы
Ответ 1
Ммм. Спасибо за вашу помощь всем. Решение, которое я придумал (с вашей помощью), выглядит следующим образом:
У меня есть два пользовательских шаблона:
my_model_list.html
my_model_detail.html
В разделе views.py:
class MyModel(object):
# ... Access other models
# ... process / normalise data
# ... store data
@staff_member_required
def my_model_list_view(request) #show list of all objects
#. . . create objects of MyModel . . .
#. . . call their processing methods . . .
#. . . store in context variable . . .
r = render_to_response('admin/myapp/my_model_list.html', context, RequestContext(request))
return HttpResponse(r)
@staff_member_required
def my_model_detail_view(request, row_id) # Shows one row (all values in the object) in detail
#. . . create object of MyModel . . .
#. . . call it methods . . .
#. . . store in context variable . . .
r = render_to_response('admin/myapp/my_model_detail.html', context, RequestContext(request))
return HttpResponse(r)
В главном django urls.py:
urlpatterns = patterns(
'',
(r'^admin/myapp/mymodel/$', my_model_list_view),
(r'^admin/myapp/mymodel/(\d+)/$', my_model_detail_view),
( r'^admin/', include( admin.site.urls ) )
)
Ответ 2
Вы можете добавить свои представления непосредственно к объекту AdminSite
, а не к какому-либо конкретному подклассу ModelAdmin
, который вы затем зарегистрируете.
Доступ к AdminSite по умолчанию осуществляется через django.contrib.admin.site
, что и называется регистром и автообнаружением. Вместо этого вы можете создать свой собственный подкласс и добавить свои собственные представления к нему, а затем зарегистрировать свои модели против этого, а не по умолчанию.
Ответ 3
Самый простой ответ - "нет". Как говорит Django Book, администратор предназначен для "Надежных пользователей, редактирующих структурированный контент", в этом случае структурированное содержимое представляет собой модели, упорядоченные по иерархии и настроенные с помощью settings.py. Что еще более важно, если ваш объект не полностью утка-типа для моделей. Мода в комплекте с ожидаемыми отношениями, администратор, вероятно, будет перебрасывать исключения по всему месту.
Однако, как говорится в мантре: "Это просто питон". Вы можете переопределить любую из страниц в admin. Просто создайте свои собственные шаблоны в своем проекте и запустите их в поиске по шаблону. Кроме того, наследуя admin/base.html, вы сохраняете внешний вид проекта администрирования.
Напишите свой административный вид и шаблоны для этого объекта, как и любые другие, но обязательно сверните представления в декораторе is_staff, чтобы гарантировать, что представления защищены от доступа неавторизованных пользователей. Поместите их в приложение, возможно, в admin/views.py, с шаблонами /admin/object _list.html и object_form.html.
После того, как у вас есть соответствующие административные инструменты для этих объектов, отличных от базы данных, вы можете затем предоставить им доступ через страницу индекса администрирования: вы хотите переопределить admin/index.html и предоставить дополнительные элементы для проекта на странице, как необходимо.
Я сделал именно это, чтобы предоставить административный доступ к сторонним API, которые хранят наши данные, такие как служба электронной почты ConstantContact, и это работает очень хорошо.