premier un petit fond: p>
J'ai un modèle code> code> qui a divers Le problème est avec l'inverse. J'ai maintenant besoin de filtrer des films à partir de l'événement principal code> code> admin. Je ne veux pas modifier le modèle code> Event code> 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, 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 /". p>
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 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. P>
Des idées de la façon dont l'URL utilise l'URL utilisée dans l'administrateur? P> event_type code> 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 code>, nommé
film code>, un gestionnaire personnalisé pour ce modèle de proxy qui le filtre uniquement à des types d'événements "film", et c'est propre Modeladmin. P>
eventAndminProxy code>, 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 code>, avec la modeladmin existant. P>
get_urls code> 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. p>
3 Réponses :
D'accord. Ajoutez celui-ci à la catégorie "Je suis une idiot". Je ne peux pas croire que je ne pensais pas à ça. Merci!
En regardant la source Django, les URL de l'administrateur sont construites à deux endroits, dans les instances la partie souhaitée Pour changer est construit dans l'instance Adminsite ( ModelAdmin Code> et dans les instances
Adminsite code>.
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
Vous pouvez également sousclure Exemple adapté pour la question: p> changelist code> et remplacer la méthode
url_for_result () code> pour personnaliser les URL de changement, (appris de Une autre réponse ), par exemple: