Django - Ruft die Namen der Parameter ab, die zum Umkehren der URL benötigt werden

8

Hintergrund

Nehmen wir an, ich habe ein URL-Muster mit Parametern, die mich mit einer Ansicht in django verbinden:

%Vor%

Und sagen wir, ich habe eine thing und eine feature :

%Vor%

Jetzt gibt mir Django die großartige Möglichkeit, eine URL zu erhalten, die mich auf eine Seite bringt, die einer bestimmten Eigenschaft einer bestimmten Sache gewidmet ist. Ich kann das so machen:

%Vor%

Frage

Jetzt bin ich auf eine Situation gestoßen, die ich genau ansprechen muss. Ich bin nicht auf der Suche nach einem Workaround - ich suche das folgende Problem zu lösen:

Wie bekomme ich die name einer URL, wie bekomme ich die Liste der kwarg Argumentnamen, die benötigt werden, um diese URL umzukehren?

Ich suche nach der Funktion get_kwarg_names_for_url . Es verhält sich so:

%Vor%

url_kwarg_names ist jetzt die Liste jedes Schlüsselworts, das ich an Djangos reverse -Funktion liefern muss, um die URL namens "thing_feature" umzukehren.

Jede Hilfe ist willkommen!

Lösung

Gestützt auf die Antwort von knbk konnte ich folgende Lösung finden:

%Vor%     
Gershom Maes 07.10.2015, 21:12
quelle

2 Antworten

2

Ich fange mit einer fairen Warnung an: Dies ist mit der öffentlichen API nicht möglich. Darüber hinaus arbeite ich aktiv daran, den URL-Dispatcher für 1.10 neu zu schreiben, so dass diese Methode wahrscheinlich zu diesem Zeitpunkt durchbrechen wird.

Zuerst müssen Sie das richtige RegexURLResolver bekommen. Wenn sich die Ansicht nicht in einem Namespace befindet, können Sie reverse_dict verwenden, um eine Liste von Möglichkeiten zu erhalten, und die Kwarts extrahieren:

%Vor%

Da ein Ansichtsname mehrere Muster mit unterschiedlichen Kwargs haben kann (obwohl Sie dies für Ihre eigene Gesundheit vermeiden möchten), wird eine Liste aller möglichen Kwargs zurückgegeben. Normalerweise wären die verschiedenen Sätze die erforderlichen Kwargs auf der einen Seite und erforderten + optionale Kwargs auf der anderen Seite.

Ich habe das nicht getestet, aber wenn es nicht funktioniert, können Sie in resolver.reverse_dict ein bisschen herumgrölen, um die genauen Einzelheiten herauszufinden. Es wurde nicht genau auf Benutzerfreundlichkeit ausgelegt.

    
knbk 07.10.2015, 21:56
quelle
0

Sie sollten dies mit einem resolve()

tun können

Aus den Dokumenten:

  

Ein ResolverMatch-Objekt kann dann abgefragt werden, um Informationen über das URL-Muster bereitzustellen, das mit einer URL übereinstimmt:

     

func, args, kwargs = resolve('/some/path/')

Spezifisch für Ihren Beispielcode:

%Vor%     
Dan O'Boyle 07.10.2015 21:46
quelle

Tags und Links