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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top