2009-12-17 9 views
2

Version du Reader's Digest: comment obtenir des données (une seule ligne si spécifiée ou table complète) d'un modèle en prenant un argument URL du nom du modèle sans coder en dur les URLconfs pour correspondre à chaque modèle? Pour plus de détails, lire sur:Django DRY URL pour l'accès au modèle

Je fais une application qui a trois modèles, et je veux faire une vue simple qui prend un nom d'un modèle, et cracher les Model.manager.all(), du gestionnaire par défaut du modèle et s'il y a un limace, un seul objet correspondant à cette limace. Je ne sais pas comment faire cela, donc je rencontre des problèmes avec avoir à faire des vues/URLconfs pour chaque modèle individuellement.

Voici ce que les URLconfs cherchent comme:

(r'^model1/$', 'model1_index_view', 'model1_index'), 
(r'^model1/(?P<slug>[-\w]+)/$', 'model1_detail_view', 'model1_detail'), 
(r'^model2/$', 'model2_index_view', 'model2_index'), 

Il se passe un peu plus longtemps, mais je pense que vous obtenez l'image. Je finis par coder en dur une quantité relativement importante d'URLconfs pour faire quelque chose que je pense pouvoir faire avec peut-être une vue qui prend un nom de modèle comme argument et éventuellement un slug. Ma préoccupation est, que se passe-t-il si quelqu'un spécifie un nom de modèle de dire ... Utilisateur? Existe-t-il un extrait de code pour obtenir une liste de modèles d'une application et s'assurer qu'elle correspond à l'un d'entre eux et non à un modèle de contrib.auth ou d'une autre application?

Répondre

8

Utilisation get_model:

from django.db.models import get_model 

def my_view(request, model_name, item_slug): 
    try: 
     model = get_model('app_name', model_name) 
    except: 
     ## throw an error 
     pass 
    objects = model.objects.get(slug=item_slug) 

Puis, en urls:

(r'^(?P<model_name>[-\w]+/(?P<slug>[-\w]+)/$', 'model_detail_view', 'model_detail'), 
+0

Merci beaucoup, vraiment l'apprécier! – Zack

+1

Vous voudrez probablement envelopper le "model.objects.get" avec un "essayer ... sauf model.DoesNotExist: augmenter Http404" pour éviter 500 erreurs. Et vous pouvez vouloir valider que model_name est l'un d'une liste limitée (vous pouvez le faire avec "(model1 | model2 | model3)" directement dans l'URLconf), pour éviter les problèmes potentiels que vous avez mentionnés de quelqu'un nommant un modèle que vous n'avez pas t l'intention d'avoir accessible. –

+0

C'est une bonne idée, je ne suis pas sûr si j'ai besoin d'ajouter l'expression rationnelle à l'URLconf dans ce cas, puisque tout ce qui est dans l'application est ouvert pour la navigation. Je garderai cela à l'esprit, cependant, il sera certainement utile dans le futur (je suis terrible avec les expressions rationnelles); la principale chose que je cherchais à éviter était cette application en quelque sorte "fuite" dans les modèles d'autres applications, comme auth. Merci encore pour le commentaire! – Zack