8
votes

Remplacer les URL de Django Admin pour un modèle spécifique?

premier un petit fond:

J'ai un modèle qui a divers event_type s. Je veux casser l'un de ces types d'événements, "film", dans son propre administrateur. J'ai la fonctionnalité de base en place: un modèle proxy héritant de événement , nommé film , un gestionnaire personnalisé pour ce modèle de proxy qui le filtre uniquement à des types d'événements "film", et c'est propre Modeladmin.

Le problème est avec l'inverse. J'ai maintenant besoin de filtrer des films à partir de l'événement principal admin. Je ne veux pas modifier le modèle Event ou son gestionnaire par défaut, car l'impact serait trop répandu. Donc, j'ai essayé de créer un autre modèle proxy, eventAndminProxy , dans le seul but de fournir une liste filtrée d'événements dans l'administrateur. J'inscrite ensuite ce modèle, au lieu de événement , avec la modeladmin existant.

Cela fonctionne évidemment, mais il a l'effet secondaire malheureux de modifier les URL dans l'administrateur. Au lieu de la Changeelist Être à "/ admin / événement / événement /", il est maintenant à "/ admin / événement / evenAndminProxy /".

Ce que j'essaie de faire est de garder cette configuration, mais aussi de garder l'ancienne URL. J'ai essayé de surcharger la méthode get_urls de Modeladmin, mais à partir de ce que je peux dire, vous ne pouvez pas contrôler l'URL complète là-bas, ce qui n'arrive que sur la partie "/ app_label / model_class /" partie.

J'ai pensé à le remplacer dans les URLs principales.Py, mais je ne peux pas comprendre une vue acceptable pour lier. Les vues réelles ne sont disponibles que sur l'objet Modeladmin Instancié, pas la classe elle-même.

Des idées de la façon dont l'URL utilise l'URL utilisée dans l'administrateur?


0 commentaires

3 Réponses :



10
votes

En regardant la source Django, les URL de l'administrateur sont construites à deux endroits, dans les instances ModelAdmin Code> et dans les instances Adminsite code>.

la partie souhaitée Pour changer est construit dans l'instance Adminsite ( django.contrib.admin.sites.adminsite code>), vous pouvez sous-classer et remplacer la méthode get_urls code>. Si vous regardez la seconde moitié de la méthode, vous verrez ceci: P>

module_name_dict = {
    EventAdminProxy: 'myfunkymodulename'
}

def get_urls(self):
    base_patterns = super(MyAdminSite, self).get_urls()
    my_patterns = patterns('',)

    for model, model_admin in self._registry.iteritems():
        if model in self.module_name_dict:
            module_name = self.module_name_dict[model]
            my_patterns += patterns('',
                url(r'^%s/%s/' % (model._meta.app_label, module_name),
                    include(model_admin.urls))
            )

    return my_patterns + base_patterns


0 commentaires

1
votes

Vous pouvez également sousclure changelist et remplacer la méthode url_for_result () pour personnaliser les URL de changement, (appris de Une autre réponse ), par exemple: xxx

Exemple adapté pour la question: xxx


0 commentaires