2017-05-16 3 views
1

Ich versuche, optionale URL-Muster in mein Django-Projekt aufzunehmen, indem ich das in dieser SO post erläuterte Muster für mehrere Routen anpasst.Django URL Multiple-Routen Muster Nicht injektiv

In meiner urls.py Datei habe ich die folgenden Muster.

urlpatterns = [ 
    url(r'^(?P<slug>[-\w]+)\/?$', View.as_view()), 
    url(r'^(?P<section>[-\w]+)\/(?P<slug>[-\w]+)\/?$', View.as_view()), 
    url(r'^(?P<section>[-\w]+)\/(?P<tag>[-\w]+)\/(?P<slug>[-\w]+)\/?$',View.as_view()), 
] 

Die Parameter section, tag und slug entsprechen Feldern zu modellieren. So gibt eine HTTP-Anfrage an /foo/bar/baz eine Modellinstanz mit einem "foo" Abschnitt, "bar" Tag und "baz" Slug zurück. Nicht alle Modellinstanzen haben eine section oder tag, diese Parameter sind optional.

Wenn Sie den URL-Dispatcher als eine Funktion mit einer Domäne von URLs und einer Codomain von Modellinstanzen betrachten, ist das Muster, das ich verwende, keine injektive Funktion. /baz, /foo/baz und /foo/bar/baz geben dieselbe Modellinstanz zurück, aber nur die letzte URL sollte die Modellinstanz zurückgeben.

Kurz gesagt, wie konfiguriere ich meine , um mein foo-bar-baz-Modell zurückzugeben, wenn und nur wenn die angeforderte URL /foo/bar/baz ist?

+0

warum akzeptierst du nicht einfach die url als eine regex und teilst sie dann mit/und tust was du machen willst? –

Antwort

0

Ich denke, das wird viel einfacher in der Ansicht sein. Aus Ihrer Sicht würde ich mir die Anfrage ansehen und, wenn der URI die falsche Form hat, eine Weiterleitung an den richtigen URI ausgeben. Das wird viel einfacher, als zu versuchen, dies in den URL-Dispatcher zu erzwingen.

+0

Sie haben recht, ich habe mit dem Überschreiben der 'get_object' Methode in' SingleObjectMixin' herumgespielt und es sieht so aus, als würde mir das das gewünschte Verhalten bringen. Vielen Dank! – kas