Sfondo
Diciamo che ho un modello di URL con i parametri che mi farà saltare a una vista in django:Django - ottenere i nomi di parametri necessari per invertire url
url(
r'^things/(?P<thing_name>\w+)/features/(?P<feature_name>\w+)$',
views.thingFeature,
name='thing_feature'
),
e permette di dire che ho un thing
e un feature
:
thing = Thing.objects.get(.....)
feature = thing.feature_set.first()
t_name = thing.name
f_name = feature.name
Ora Django mi dà la straordinaria capacità di ottenere un URL che mi porta a una pagina dedicata ad una caratteristica specifica di una specifica t Hing. Posso farlo in questo modo:
from django.core.urlresolvers import reverse
url = reverse('thing_feature', thing_name=t_name, feature_name=f_name)
# url == '/things/thing2/features/left-arm'
Domanda
Ora mi hai inciampato in una situazione che ho bisogno di affrontare specificamente. Io non sto cercando una soluzione - Sto cercando di risolvere il seguente problema:
Data di name
un URL, come faccio ad ottenere l'elenco dei nomi degli argomenti kwarg
necessarie per invertire tale URL?
Sto cercando la funzione get_kwarg_names_for_url
. Si comporta in questo modo:
url_kwarg_names = get_kwarg_names_for_url('thing_feature')
# url_kwarg_names == ['thing_name', 'feature_name']
url_kwarg_names
è ora la lista di ogni parola chiave che ho bisogno di fornire alla funzione di Django reverse
al fine di invertire l'url di nome "thing_feature"
.
Qualsiasi aiuto è apprezzato!
Soluzione
in base alla risposta del knbk sono stato in grado di venire con la seguente soluzione:
def get_kwarg_names_for_url(url_name):
resolver = get_resolver(get_urlconf())
reverse_data = resolver.reverse_dict[url_name]
pattern_list = reverse_data[0]
'''
Need to specify the 1st pattern because url regexes can
potentially have multiple kwarg arrangments - this function does
not take this possibility into account.
'''
first_pattern = pattern_list[0]
'''
`first_pattern` is now of the form `(url_string, kwarg_list)` -
all we are interested in is the 2nd value.
'''
return first_pattern[1]
Sono appena sceso in una tana del coniglio di: invertire l'url, abbinare l'url a un urlpattern, compilare la regex urlpattern e ispezionare il 'groupindex' della regex ... Devo mancare qualcosa qui. – Monkpit
Un problema è che non è possibile invertire l'url prima di conoscere già i nomi dei parametri url richiesti - django genererà un errore per 'reverse ('thing_feature')' perché mancano i kwarg necessari! –
Puoi provare questo http://stackoverflow.com/a/1275601 Mi sono cimentato qui, e usando '.items()' invece, restituisce una bella lista di tuple che contiene i kwargs. Devi andare più in profondità sembra essere un buon inizio, sfortunatamente sto andando a casa ora e non può andare più in profondità. –
Tiago