Джанго, как сгенерировать админку без моделей?

Я создаю довольно большой проект, который в основном состоит из этого:

Сервер 1: Ледяные сервисы. Glacier2 для обработки сессий. Брандмауэр, разрешающий доступ к Glacier2.

Сервер 2: Веб-интерфейс (прочитанный, общедоступный) для сервисов Ice через Glacier2. Интерфейс администратора для сервисов Ice через Glacier 2.

Меня больше всего беспокоит веб-интерфейс. Я хочу использовать Django, потому что он написан на python и имеет невероятно полезный автоматический генератор панели администратора.

Веб-интерфейс не обращается ни к одной базе данных. Он подключается к службе Ice на сервере № 1 через маршрутизатор Glacier2 и использует API, предоставляемый этими службами, для управления данными.

И, как вы, наверное, знаете, генерация администратора в Django зависит от использования Django ORM; который я не использую, так как у меня нет базы данных для доступа.

Поэтому мне нужно сгенерировать панель администратора, но вместо стандартного доступа к данным, как это обычно делает ORM, мне нужно перехватывать любые вызовы «db-access» и преобразовывать их в вызовы службы Ice, а затем получать выходные данные службы ( если есть), преобразуйте его в то, что обычно возвращает ORM, и верните управление Django.

Кто-нибудь знает, как я мог это сделать? что мне нужно для подкласса? Есть конкретные идеи?

Спасибо за ваше время.


person user168833    schedule 28.11.2009    source источник


Ответы (4)


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

Взгляните на models.py, admin.py и urls.py здесь: django-webfaction

Чтобы создать запись на странице индекса администратора, используйте фиктивную модель с параметром manage=False.

Зарегистрируйте эту модель у администратора.

Затем вы можете перехватить URL-адреса администратора и направить их на свои представления.

Это имеет смысл, если действия добавления/редактирования/удаления, предоставляемые администратором, имеют смысл для вашего приложения. В противном случае вам лучше переопределить индекс администратора или шаблоны списка изменений, чтобы включить свои собственные настраиваемые действия.

person Andy Baker    schedule 28.11.2009
comment
Я скачал ваше приложение, и мне нравится общая реализация. Что касается того, что на самом деле делают сервисы, основные из которых я уже разработал, это сводится к: учетным записям (аутентификация, пользователи, группы, разрешения), настройкам (для каждой службы и даже веб-интерфейса), журналу (журналы действий). каждым пользователем, не то же самое, что панель администратора «Последние действия»), Задания (очередь для других сервисов) и собственно сервисы, которые делают что-то интересное, которые еще предстоит разработать. Итак, 9/10, набор действий добавления/редактирования/удаления сохраняется. Для этой 1/10 я всегда могу создать свои собственные настроенные страницы, как это делает ваше приложение. - person user168833; 29.11.2009

Настоящая сила contrib.admin заключается в django Forms. По сути, инструмент администратора в основном автоматически генерирует форму для соответствия модели с добавлением небольшого количества маршрутизации urls.py. В конце концов, вероятно, было бы проще использовать формы django отдельно от инструмента администрирования.

person T. Stone    schedule 28.11.2009
comment
+1. Он должен взять пример кода из предоставленного вами URL-адреса, заставить его работать, а затем адаптировать его для своих целей. - person steveha; 29.11.2009
comment
Я проверю документацию, которую вы связали. - person user168833; 29.11.2009

вы можете «издеваться» над некоторым классом, чтобы он выглядел как модель, но он проксирует ваши API

f.e.

class QuerysetMock(object):
    def all():
        return call_to_your_api()
    [...]


class MetaMock(object):
     def fields():
         return fields_mock_objects..
     verbose_name = ''
     [...]

class ModelMock(object):
    _meta = MetaMock()
    objects = QuerysetMock()

admin.site.register(ModelMock)

Это может сработать.. но вам нужно сделать много вещей, совместимых с django.model

person Pydev UA    schedule 28.11.2009

Django ORM имеет подключаемый бэкент, что означает, что вы можете написать бэкэнд для вещей, которые не являются СУБД. Вероятно, это довольно объемная задача, но для начала лучше всего начать с выступления Малкольма Трединника на DjangoCon 2008, Внутри ORM.

В противном случае вы могли бы вообще обойти ORM, и написать формы вручную для нужного вам доступа.

person jcdyer    schedule 28.11.2009