2009-07-15 3 views
0

Je suis en train de faire quelque chose comme ça dans myproject.myapp.urls:Django: inclure d'autres urlpatterns dans un seul urls.py

from django.conf.urls.defaults import * 

urlpatterns = patterns('myproject.myapp.views', 
    (ur'^$', 'index'), 
    (ur'^browse/$', 'browse'), 
    (ur'^request/new/$', 'new_request'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/$', 'view1'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/asdf$', 'view2'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/qwer$', 'view3'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/zxcv$', 'view4'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/tyui$', 'view5'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/ghjk$', 'view6'), 
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/bnm/more-looong-url/$', 'view7'), 
    ... 
) 

J'ai essayé de factoriser ci-dessus les règles et les définir dans un autre fichier urls2.py comme ceci:

(ur'^(?P<url_key>[-a-zA-Z0-9]+)/', include('myproject.myapp.urls2')), 

mais il semble causer des problèmes avec les tests unitaires, y compris les urlresolvers.

Y a-t-il une meilleure façon de "refactoriser" la partie commune de l'expression régulière (<url_key>) ici?

+1

Quels problèmes at-il la cause? Utiliser include ('') est généralement assez simple. Pourriez-vous décrire les erreurs qu'il a provoquées ou comment les résultats diffèrent-ils de ce que vous attendiez? – anschauung

Répondre

1

Je ne pense pas que vous pouvez faire ce que vous essayez de faire avec cette ligne:

(ur'^(?P<url_key>[-a-zA-Z0-9]+)/', include('myproject.myapp.urls2')) 

Quelle vue le paramètre url_key va-t-il être transmis?

Je ne sais pas pourquoi vous voulez factoriser les urlpatterns pour commencer, mais peut-être ce serait mieux ?:

from django.conf.urls.defaults import * 

URL_KEY = ur'^(?P<url_key>[-a-zA-Z0-9]+)' 

urlpatterns = patterns('myproject.myapp.views', 
    (ur'^$', 'index'), 
    (ur'^browse/$', 'browse'), 
    (ur'^request/new/$', 'new_request'), 
    (URL_KEY+ur'/$', 'view1'), 
    (URL_KEY+ur'/asdf$', 'view2'), 
    (URL_KEY+ur'/qwer$', 'view3'), 
    ...etc 
) 
+0

Eh bien, j'ai corrigé mes problèmes de test et j'ai encore adopté ma solution originale, mais c'est une bonne suggestion. Donc, je choisis cela comme réponse. :) – Achimnol

3

Je ne suis pas un expert en django, mais l'élément 'view1' ne correspondrait-il pas à toutes les autres entrées en dessous puisqu'il ne possède pas de '$' à la fin? Ainsi, les autres vues n'auraient aucune chance d'être appariées.

+0

+1 mettre le fourre-tout à la fin ou simplement ajouter $ pour chaque URL. – Soviut

+0

Ah, c'est mon erreur. Je vous donne un vote. :) – Achimnol

0

Vous pourriez peut-être simplifier les expressions dans myproject.myapp.urls, et à la place passer les informations en tant que paramètre à une fonction dans myproject.myapp.views? Je ne suis pas sûr de ce qui n'allait pas dans vos tests, mais en général, vous serez en mesure d'en faire plus en myproject.myapp.views puisque vous n'avez pas à tout baser sur la logique regex.

Cette fonction dans myproject.myapp.views serait un standard téléphonique qui appelle View1, view2, etc

Questions connexes