2008-10-03 14 views
6

Ich habe eine hübsche Standard-Django-App und frage mich, wie ich das URL-Routing einstellen soll, damit ich nicht jede URL explizit einer Ansicht zuordnen muss.Django: Wie erstelle ich ein generisches URL-Routing zu Sichten?

Zum Beispiel sagen wir, dass ich die folgenden Ansichten habe: 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 wie:

map.connect(':controller/:action/:id') 

Und es wäre die richtige Steuerung und Funktion automatisch greifen. Gibt es in Django etwas Ähnliches?

+0

Warte, willst du '^ Links/$', um auf 'mysite.app.views.links' zu zeigen? –

+0

Ja, Kopieren/Einfügen Fehler sind ziemlich süß. – swilliams

Antwort

5
mods = ('Project','Links','Profile','Contact') 

urlpatterns = patterns('', 
    *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods) 
) 
+0

Das gibt mir einen Fehler "Generator" -Objekt hat keine "Auflösung". Ich denke, ich weiß, was du zu tun versuchst (schreibe eine Route für jeden String im Tupel), aber es erzeugt einen Generator, den der Django nicht auflösen kann. – swilliams

+0

Ich habe es nicht getestet, versuche den Generator mit einem * (... für ...) auszupacken. Ich bearbeite die Antwort – Javier

+0

Ich bekomme jetzt einen Syntaxfehler mit diesem. Ich habe noch nie * so gesehen ... soll das einen Zeiger wie C dereferenzieren? Könnten Sie das bitte vor dem Posten testen? – swilliams

5

Sofern Sie eine wirklich riesige Anzahl von Ansichten haben, schreiben sie explizit nach unten ist nicht allzu schlecht, von einem Stil Perspektive.

Sie Ihr Beispiel verkürzen können, aber durch das Präfix Argument der patterns Funktion:

def router(request, function, module): 
    m =__import__(module, globals(), locals(), [function.lower()]) 
    try: 
     return m.__dict__[function.lower()](request) 
    except KeyError: 
     raise Http404() 

:

urlpatterns = patterns('mysite.app.views', 
    (r'^Project/$', 'project'), 
    (r'^Links/$', 'links'), 
    (r'^Profile/$', 'profile'), 
    (r'^Contact/$', 'contact'), 
) 
+0

Das stimmt, aber jetzt fühle ich mich verpflichtet. :) – swilliams

5

Sie könnten eine ganz spezielle Funktion in dieser Richtung nutzen können und dann eine urlconf wie folgt:

(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}), 

Dieser Code ist nicht getestet, aber th Die allgemeine Idee sollte funktionieren, auch wenn Sie sich erinnern sollten:

Explizit ist besser als implizit.

Verwandte Themen