2009-11-28 3 views
5

Je construis un assez grand projet, qui consiste essentiellement en ceci:Django, comment générer un panneau d'administration sans modèles?

Serveur 1: Services basés sur la glace. Glacier2 pour la gestion des sessions. Pare-feu permettant l'accès à Glacier2.

Server 2: interface Web (lecture, public) pour les services de glace via Glacier2. Interface d'administration pour les services de glace via Glacier 2.

Le point que je suis préoccupé par est l'interface Web. Je veux utiliser Django, car il est écrit en python et possède un générateur de panneau d'administration automatique incroyablement utile.

L'interface Web n'accède à aucune base de données. Il se connecte à un service Ice sur le serveur n ° 1 via le routeur Glacier2 et utilise l'API exposée par ces services pour manipuler les données.

Et comme vous le savez probablement, la génération d'admin dans Django dépend de l'utilisation de l'ORM de Django; que je n'utilise pas puisque je n'ai pas de base de données pour y accéder. J'ai donc besoin de générer le panneau d'administration, mais, au lieu d'avoir un accès aux données standard comme le fait normalement l'ORM, j'ai besoin d'intercepter tous les appels "db-access" et de les transformer en appels de service Ice, puis la sortie du service (le cas échéant), transformez-la en ce que l'ORM renvoie normalement et retournez le contrôle à Django.

Quelqu'un sait comment je pourrais faire cela? De quoi aurais-je besoin pour sous-classer? Des idées spécifiques?

Merci pour votre temps.

Répondre

7

Je pense qu'il pourrait y avoir un moyen plus simple que d'écrire ORMES personnalisés pour obtenir l'intégration d'administration que vous voulez. Je l'ai utilisé dans une application qui permet de gérer les comptes de messagerie Webfaction via leur API du Panneau de configuration.

Jetez un oeil à models.py, admin.py et urls.py ici: django-webfaction

Pour créer une entrée dans l'index admin page, utilisez un modèle de mannequin qui a réussi = False

Enregistrez-vous ce modèle avec l'administrateur.

Vous pouvez ensuite intercepter les URL d'administration et les diriger vers vos propres vues. Cela a du sens si les actions d'ajout/d'édition/de suppression fournies par l'administrateur ont un sens pour votre application. Sinon, il est préférable de remplacer l'index d'administration ou les modèles de listes de modifications pour inclure vos propres actions personnalisées.

+0

J'ai téléchargé votre application, et j'aime l'implémentation générale. En ce qui concerne ce que les services font réellement, les principaux que j'ai déjà conçus, il s'agit de: Comptes (authentification, utilisateurs, groupes, permissions), Paramètres (pour chaque service, et même l'interface Web), Log (enregistre les actions de chaque utilisateur, pas les mêmes que les actions récentes du panneau d'administration), les travaux (file d'attente pour d'autres services) et les services réels qui font quelque chose d'intéressant, qui doivent encore être conçus. Donc, 9/10, l'ensemble d'actions add/edit/delete est valide. Pour ce 1/10, je peux toujours générer mes propres pages personnalisées comme le fait votre application. – user168833

+0

+1 pour avoir suggéré 'managed = False' – Don

0

Le django ORM a une backent connectable, ce qui signifie que vous pouvez écrire un back-end pour des choses qui ne sont pas SGBDR. C'est probablement une tâche assez importante, mais un bon endroit pour commencer est avec le discours de Malcolm Tredinnick de DjangoCon 2008, Inside the ORM.

Sinon, vous pourriez contourner le ORM tout à fait, et d'écrire les formulaires manuellement pour l'accès dont vous avez besoin.

3

La puissance réelle du contrib.admin est django Forms. En substance, l'outil d'administration génère automatiquement un formulaire pour correspondre à un modèle avec un peu de routage urls.py lancé. À la fin, il serait probablement plus facile d'utiliser django Forms en dehors de l'outil d'administration.

+0

+1. Il devrait saisir l'exemple de code de l'URL que vous avez fourni, le faire fonctionner, puis l'adapter à ses objectifs. – steveha

+0

Je vais vérifier la documentation que vous avez liée. – user168833

1

vous pouvez « maquette » une classe pour ressembler à un modèle, mais il fait proxy à vos 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) 

Cela peut fonctionner .. mais vous devez faire beaucoup django.model choses compatibles

Questions connexes