Django: Wie erstelle ich eine generische URL-Routing zu Ansichten?
Frage
Ich habe eine ziemlich Standard django app, und ich frage mich, wie die URL-Routing setzen, so dass ich nicht explizit jede URL einer Karte ansehen müssen.
Zum Beispiel, sagen wir mal, dass ich die folgenden Ansichten haben: Project, Links, Profile, Contact
. Ich möchte lieber nicht meine urlpatterns
aussehen wie dieses:
(r'^Project/$', 'mysite.app.views.project'),
(r'^Links/$', 'mysite.app.views.links'),
(r'^Profile/$', 'mysite.app.views.profile'),
(r'^Contact/$', 'mysite.app.views.contact'),
Und so weiter. In Pylons , wäre es so einfach sein wie:
map.connect(':controller/:action/:id')
Und es wäre die richtige Steuerung und Funktion automatisch greifen. Gibt es etwas ähnliches in Django?
Lösung
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Andere Tipps
Wenn Sie eine wirklich haben große Anzahl von Ansichten, schreibt sie explizit nach unten ist nicht allzu schlecht, von einem Stil Perspektive.
Sie können Ihr Beispiel verkürzen, aber durch das Präfix Argument der patterns
Funktion:
urlpatterns = patterns('mysite.app.views',
(r'^Project/$', 'project'),
(r'^Links/$', 'links'),
(r'^Profile/$', 'profile'),
(r'^Contact/$', 'contact'),
)
Möglicherweise können Sie eine ganz spezielle Funktion in dieser Richtung verwenden:
def router(request, function, module):
m =__import__(module, globals(), locals(), [function.lower()])
try:
return m.__dict__[function.lower()](request)
except KeyError:
raise Http404()
und dann ein URLconf wie folgt aus:
(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}),
Dieser Code ist nicht getestet, aber die allgemeine Idee sollte funktionieren, obwohl Sie sollten daran denken:
Explicit ist besser als implizit.