Можно ли создать собственный вид администратора без модели позади него - PullRequest
21 голосов
/ 10 ноября 2010

У меня есть объект, который я хочу использовать под администратором вместо модели, которая наследует модели. Модель. Если я сделаю так, чтобы он наследовал models.Model, этот объект создаст таблицу в базе данных, которая мне не нужна. Я только хочу, чтобы этот объект остался в памяти.

Одним из решений, которое я получил от хороших людей при переполнении стека, является то, что я создаю административные представления, регистрирую эти настраиваемые представления через modelAdmin (admin.site.register ()) в admin.py и использую этот подобный модели объект как динамическое хранилище данных (в памяти).

Так как эта модель, подобная объекту, не наследуется от models.Model, admin.site.register () (под admin.py) не принимает его и показывает, что «тип» объект не повторяется », когда я пытаюсь получить доступ это в браузере.

Ответы [ 3 ]

15 голосов
/ 11 ноября 2010

Ммм.Спасибо за вашу помощь всем.Решение, которое я придумал (с вашей помощью конечно :), следующее:

У меня есть два пользовательских шаблона:

   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's 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 ) )
)
6 голосов
/ 11 ноября 2010

Вы можете добавлять свои представления непосредственно к объекту AdminSite, а не к какому-либо конкретному подклассу ModelAdmin, который вы затем регистрируете.

Доступ к AdminSite по умолчанию осуществляется через django.contrib.admin.site, что называется регистрацией и автообнаружением. Вместо этого вы можете создать свой собственный подкласс и добавить к нему свои собственные представления , а затем зарегистрировать свои модели вместо этого, а не по умолчанию.

2 голосов
/ 11 ноября 2010

Самый простой ответ - «нет». Как сказано в Django Book, администратор предназначен для «Доверенных пользователей, редактирующих структурированный контент», в данном случае структурированный контент представляет собой модели, упорядоченные в иерархии и сконфигурированные с помощью settings.py. Что еще более важно, если ваш объект не полностью соответствует типу модели. Модель дополнена ожидаемыми отношениями, администратор, вероятно, повсюду выбросит исключения.

Однако, как говорится в мантре: «Это просто питон». Вы можете переопределить любую из страниц в админке. Просто создайте свои собственные шаблоны в своем проекте, и пусть они будут на первом месте в поиске шаблонов. Кроме того, наследуя admin / base.html, вы сохраняете внешний вид административного проекта.

Напишите ваше административное представление и шаблоны для этого объекта, как и любые другие, но не забудьте обернуть представления в декораторе is_staff, чтобы гарантировать, что представления защищены от доступа неавторизованных пользователей. Поместите их в приложение, возможно, в admin / views.py, с помощью templates / admin / object_list.html и object_form.html.

Если у вас есть соответствующие инструменты администрирования для этих объектов, не относящихся к базе данных, вы можете предоставить им доступ через страницу индекса администрирования: вы хотите переопределить admin / index.html и предоставить дополнительные элементы, относящиеся к проекту, как необходимо.

Я сделал именно это, чтобы предоставить административный доступ к сторонним API, которые хранят наши данные, например, к почтовому сервису ConstantContact, и он работает довольно хорошо.

...