2009-11-28 21 views
5

Ich baue ein ziemlich großes Projekt, das im Wesentlichen aus diesem besteht:Django, wie man ein Admin-Panel ohne Modelle erzeugt?

Server 1: Eisbasierte Dienste. Glacier2 für Sitzungsbehandlung. Firewall für den Zugriff auf Glacier2.

Server 2: Web-Schnittstelle über Glacier2 (Lesen, öffentlich) für Ice Dienstleistungen. Admin-Interface für Ice-Dienste über Glacier 2.

Der Punkt, den ich mit den betroffenen bin, ist das Web-Interface. Ich möchte Django verwenden, weil es sowohl in Python geschrieben ist als auch einen unglaublich nützlichen automatischen Admin Panel Generator hat.

Die Webschnittstelle greift nicht auf eine Datenbank zu. Es stellt über den Glacier2-Router eine Verbindung zu einem Ice-Dienst auf Server 1 her und verwendet die API, die von diesen Diensten zur Verfügung gestellt wird, um Daten zu manipulieren.

Und wie Sie wahrscheinlich wissen, hängt die Admin-Generation in Django über die Verwendung von Django ORM; was ich nicht benutze, da ich keine Datenbank zum Zugriff habe.

Also muss ich das Admin-Panel generieren, aber anstatt einen Standard-Datenzugriff wie das ORM normalerweise hat, muss ich alle "db-access" -Aufrufe abfangen und sie in Ice Service-Aufrufe verwandeln, und dann nehmen die Ausgabe des Dienstes (falls vorhanden), transformiere sie in das, was der ORM normalerweise zurückgibt, und gebe die Steuerung an Django zurück.

Weiß jemand, wie ich das tun könnte? Was müsste ich unterklassieren? Irgendwelche spezifischen Ideen?

Danke für Ihre Zeit.

Antwort

7

ich könnte es einen einfacheren Weg, als ORMS individuelle Schreiben der Admin-Integration Sie wollen zu bekommen. Ich habe es in einer App verwendet, die die Verwaltung von Webfaction-E-Mail-Konten über ihre Control Panel API ermöglicht.

Werfen Sie einen Blick auf models.py, admin.py und URLs.py hier: django-webfaction

Um einen Eintrag auf der Admin-Indexseite erstellen ein Dummy-Modell verwenden, = False

Register, das Modell mit dem Admin geschaffen hat.

Sie können dann die Admin-URLs abfangen und sie auf Ihre eigenen Ansichten verweisen.

Dies ist sinnvoll, wenn die Add/Edit/Delete-Aktionen, die der Admin bietet, sinnvoll für Ihre App sind. Andernfalls überschreiben Sie besser den Admin-Index oder die Vorlagen für Änderungslisten, um Ihre eigenen benutzerdefinierten Aktionen einzubinden.

+0

Ich habe Ihre App heruntergeladen, und ich mag die allgemeine Implementierung. Was die Dienste tatsächlich tun, die Kernbereiche, die ich bereits entwickelt habe, sind: Konten (Authentifizierung, Benutzer, Gruppen, Berechtigungen), Einstellungen (für jeden Dienst und sogar die Webschnittstelle), Protokoll (protokolliert Aktionen von jedem Benutzer, nicht das gleiche wie das Admin-Panel 'Letzte Aktionen', Jobs (Warteschlange für andere Dienste) und die eigentlichen Dienste, die etwas Interessantes tun, die noch zu entwickeln sind. Also, 9/10, der Aktionssatz zum Hinzufügen/Bearbeiten/Löschen ist gültig. Für diesen 1/10 kann ich immer meine eigenen angepassten Seiten erstellen, wie es bei deiner App der Fall ist. – user168833

+0

+1 für das Vorschlagen von 'verwaltet = Falsch' – Don

0

Die django ORM hat eine steckbare backent, was bedeutet, dass Sie ein Back-End für Dinge schreiben kann, die nicht RDBMSes sind. Es ist wahrscheinlich eine ziemlich große Aufgabe, aber ein guter Anfang ist mit Malcolm Tredinnicks Vortrag von DjangoCon 2008, Inside the ORM.

Andernfalls könnten Sie die ORM ganz umgehen, und schreiben Sie die Formulare manuell für den Zugriff Sie benötigen.

3

Die wahre Macht des contrib.admin ist django Forms. Im Wesentlichen generiert das Admin-Tool automatisch ein Formular, das einem Modell mit ein wenig URLs.py-Routing entspricht. Letztendlich wäre es wahrscheinlich einfacher, django Forms außer dem Admin-Tool zu verwenden.

+0

+1. Er sollte sich den Beispielcode von der URL holen, die Sie zur Verfügung gestellt haben, damit er funktioniert, und dann an seine Zwecke anpassen. – steveha

+0

Ich überprüfe die Dokumentation, die Sie verlinkt haben. – user168833

1

Sie können „Mock“ einige Klasse, so dass es wie ein Modell aussehen, aber es tut Proxy Ihre APIs

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) 

Diese Arbeit kann .. aber Sie müssen

denke viel django.model kompatibel Sachen tun