2008-10-30 5 views
16

Ich habe ein Django-Modell mit einer großen Anzahl von Feldern und mehr als 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:Django: Beliebige Anzahl unbenannter urls.py-Parameter

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

wo ‚name‘ Karten auf ein Modell Attribut und ‚Wert‘ ist das Suchkriterium für dieses Attribut. Jeder "Name" wird wie eine Kategorie behandelt, um Teilmengen der Modellinstanzen zurückzugeben, in denen die Kategorien übereinstimmen.

Jetzt könnte dies mit GET-Parameter behandelt werden, aber ich bevorzuge mehr lesbare URLs für den Benutzer und die Suchmaschinen. Diese URL-Untergruppen werden auf jeder Seite eingebettet, auf der dieses Modell angezeigt wird. Es lohnt sich also, schöne URLs zu erstellen.

Im Idealfall wird jeder Name/Wert-Paar in die View-Funktion als Parameter übergeben name1 genannt, name2 usw. Aber ich glaube nicht, dass es über einen regulären Ausdruck des angepassten Text definiert benannte Muster möglich ist. Liege ich da falsch?

Also, es scheint, dass ich so etwas wie dies tun müssen:

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, übergibt es nur das letzte Name/Wert-Paar als Parameter an die View-Funktion. Meine Vermutung ist, dass jedes Spiel das vorherige Spiel überschreibt. 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 die letzten passendes Muster.

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

+0

denke ich, dass „GET-Abfrage wie“ implementieren Schlüssel-Wert-params URL selbst ein bisschen hässlich ist und nicht „true“. –

+0

@alex - abgesehen davon, dass die URL nicht lesbar ist, werden Suchmaschinen wahrscheinlich nicht alle Ihre Inhalte indexieren, wenn Sie mehr als ein paar Parameter haben (wenn das). –

Antwort

11

Eine Möglichkeit, die Sie berücksichtigen könnten, ist die Übereinstimmung der gesamten Zeichenfolge von möglichen Werten innerhalb des URL-Musterabschnitts und das Herausziehen der spezifischen Teile in Ihrer Ansicht. Als 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.

(Herausgegeben zu versuchen, die regexp zu beheben.)

+0

Danke, ich stimme zu, das ist wahrscheinlich der einfachste Weg, um das Problem zu lösen. –

+1

Um nur einen Text hier für andere in meiner Situation zu setzen, ist dies die einzige Lösung, die ich gefunden habe, um eine beliebige Anzahl von Matrixelementen in einer [Matrix-URI] zu analysieren (http://www.w3.org/DesignIssues/MatrixURIs) .html). Ordne alle Matrixelemente zusammen und analysiere sie dann in der Ansicht. – KobeJohn

+1

gleich hier, und es ist 2016 – benzkji

3

ich mit Adam einverstanden ist, aber ich denke, das Muster in urls.py sein sollte:

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

Das '\ w' wird nur Spiel 'Wort' Zeichen, aber das '.' passt alles zusammen.

+0

Ich bin schrecklich bei regulären Ausdrücken und nur erraten, heh. – Adam

0

Die gleiche Antwort kam mir beim Lesen der Frage.

Ich glaube, Model_Browse View ist die beste Möglichkeit, um die Abfrageparameter zu sortieren und es als generischer Router zu verwenden.

0

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:

Das folgende Beispiel zeigt, wie man Erhalten Sie alle Verkäufe eines Tages für einen Standort, indem Sie den Namen store und , 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>.+)-(?P<store>[0-9]+) ändern. Beachten Sie, dass location und sales keine Schlüsselwörter sind, sie verbessern nur die Lesbarkeit der URL.

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, dass es jemand hilft!

Mit freundlichen Grüßen,

Michael

0

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 verwendet habe, unnamed url parameters und eine sich wiederholende regexp. Um das "ist kein gültiger regulärer Ausdruck: mehrfache Wiederholung" zu erhalten, platziere ich ein Wort am Anfang der Liste.

Ich arbeite immer noch in der Ansicht die Liste zu erhalten. Aber ich denke, krank 'gehen durch die Argumente oder Kwargs .. Kann es immer noch nicht genau sagen.

Meine 2 Cent