Подтвердить что ты не робот

Возможно ли создать пользовательский вид администратора без модели позади него

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

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

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

4b9b3361

Ответ 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, и это работает очень хорошо.