2009-11-28 2 views
5

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

Сервер 1: Услуги на основе льда. Glacier2 для обработки сеанса. Брандмауэр, обеспечивающий доступ к Glacier2.

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

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

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

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

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

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

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

ответ

7

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

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

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

Регистрация эту модель с администратором.

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

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

+0

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

+0

+1 для предложения 'managed = False' – Don

0

Django ORM имеет подключаемый модуль, что означает, что вы можете написать бэкэнд для вещей, которые не являются RDBMS. Это, вероятно, довольно большая задача, но хорошее место для начала - беседа Малкольма Тредринчика с DjangoCon 2008, Inside the ORM.

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

3

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

+0

+1. Он должен взять код примера из предоставленного вами URL-адреса, заставить его работать, а затем адаптировать его к своим целям. – steveha

+0

Я проверю связанную документацию. – user168833

1

вы можете «фиктивный» некоторый класс, так что выглядеть как модель, но она делает прокси для ваших 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 совместимого материала

Смежные вопросы