Frage

Ich habe ein Django-Modell mit einer großen Anzahl von Feldern und 20000+ Tabellenzeilen. Um die Menschen lesbare URLs und die Fähigkeit, zu erleichtern die große Liste in beliebige Teillisten zu brechen, würde Ich mag eine URL haben, die wie folgt aussieht:

/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....

Dabei steht ‚name‘ Karten auf ein Modell Attribut und ‚Wert‘ die für dieses Attribut Suchkriterien. Jeder „name“ wird wie eine Kategorie behandelt werden Teilmengen der Modellinstanzen zurückzukehren, in dem die Kategorien entsprechen.

Nun könnte dies mit GET-Parameter behandelt werden, aber ich ziehe es besser lesbar URLs sowohl für den sake des Benutzers und die Suchmaschinen. Diese URLs Untergruppen werden auf jeder Seite eingebettet werden, die dieses Modell zeigt, so scheint es die Mühe wert zu ziemlich URLs zu machen.

Im Idealfall jeder Name / Wert-Paar wird als Parameter namens name1, name2 usw. jedoch der Ansicht Funktion übergeben werden, ich glaube nicht, dass es über einen regulären Ausdruck des angepassten Text definiert benannte Muster möglich ist. Bin ich da falsch?

Also, es scheint, ich brauche so etwas wie dies zu tun:

urlpatterns = patterns('',
    url(r'^browse/(?:([\w]+)/([\w]+)/)+$', 'app.views.view', name="model_browse"),
)

Es scheint dies keine Sets von zwei Name / Wert-Paare passen sollte. Während es erfolgreich übereinstimmt, geht es nur das letzte Namen / Wert-Paar als Parameter an die View-Funktion. Meine Vermutung ist, dass jedes Spiel das vorherige Spiel wird überschrieben wird. Unter der Vermutung, dass die enthält (?: ...) + verursacht es, habe ich versucht, ein einfaches wiederholendes Muster statt:

urlpatterns = patterns('',
    url(r'^browse/([\w]+/)+$', 'app.views.view', name="model_browse"),
)

... und bekam das gleiche Problem, aber dieses Mal *args enthält nur das letzte abgestimmte Muster.

Ist dies eine Einschränkung von Djangos URL Dispatcher und / oder Python Regex Unterstützung? Es scheint eine dieser Methoden funktionieren sollte. Gibt es eine Möglichkeit, dies ohne zu erreichen hartzucodieren jedes mögliche Modell-Attribut in der URL als optionale (. *) Muster?

War es hilfreich?

Lösung

Eine Möglichkeit, die Sie berücksichtigen könnten, wird die gesamte Kette von möglichen Werten innerhalb des URL-Musters Teil passend und die spezifischen Stücke in der View herausziehen. Als ein Beispiel:

urlpatterns = patterns('',
    url(r'^browse/(?P<match>.+)/$', 'app.views.view', name='model_browse'),
)

def view(request, match):
    pieces = match.split('/')
    # even indexed pieces are the names, odd are values
    ...

Keine Versprechungen über die regexp ich verwendet, aber ich denke, Sie verstehen, was ich meine.

(Edited zu versuchen, die regexp zu beheben.)

Andere Tipps

Ich stimme mit Adam, aber ich denke, das Muster in urls.py sein sollte:

... r'^browse/(?P<match>.+)/$' ...

Die ‚\ w‘ wird nur Spiel ‚Wort‘ Zeichen, aber die ‚‘ Match wird nichts.

Die gleiche Antwort zu mir kam, während die Frage zu lesen.

Ich glaube, model_browse Sicht ist der beste Weg, um die Abfrageparameter zu sortieren und sie als generischer Router verwenden.

Ich denke, die Antwort von Adam allgemeineren ist als meine Lösung, aber wenn Sie eine feste Anzahl von Argumenten in der URL verwenden möchten, können Sie auch etwas tun, wie folgt aus:

Das folgende Beispiel zeigt, wie für einen Standort alle Verkäufe eines Tages erhalten, indem Sie den Namen der store und der year, month und day eingeben.

urls.py :

urlpatterns = patterns('',
    url(r'^baseurl/location/(?P<store>.+)/sales/(?P<year>[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9])/$', views.DailySalesAtLocationListAPIView.as_view(), name='daily-sales-at-location'),
)

Alternativly, könnten Sie auch die ID des Speichers verwenden, indem (?P<store>.+) Wechsel (?P<store>[0-9]+). Beachten Sie, dass location und sales sind keine Schlüsselwörter, sie nur die Lesbarkeit der URL verbessern.

views.py

class DailySalesAtLocationListAPIView(generics.ListAPIView):
    def get(self, request, store, year, month, day):
        # here you can start using the values from the url
        print store
        print year
        print month
        print date

        # now start filtering your model

Hoffe, es hilft jemand!

Mit freundlichen Grüßen,

Michael

Ich habe eine alternative Lösung, die nicht ganz anders als die vorherigen, aber es ist mehr verfeinert:

url(r'^my_app/(((list\/)((\w{1,})\/(\w{1,})\/(\w{1,3})\/){1,10})+)$'

Ich habe verwendet unbenannte URL-Parameter und ein repetitiver regexp. Nicht zu bekommen die „ist kein gültiger regulärer Ausdruck: mehrfach wiederholen.“ Ich stelle ein Wort am Anfang der Liste

Ich arbeite immer noch an der Ansicht, das die Liste aufzunehmen. Aber ich denke, krank‘gehen durch die args oder kwargs .. Kann nicht noch es genau sagen.

Meine 2 Cent

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