Domanda

Devo costruire un url in modo dinamico, secondo l'url corrente.Utilizzando il {% url %} tag è il modo più semplice per farlo, ma ho bisogno url corrente, nome per generare la nuova dinamica.

Come posso ottenere il nome dell'url allegato al urlconf che porta alla visualizzazione corrente?

EDIT :So che posso manualmente artigianato url get_absolute_url ma preferisco evitare perché è una parte di una lezione e vorrei mostrare solo un modo di costruire gli url.

Gli studenti sanno usare {% url %}.Sono già di fronte a un problema quando si hanno a generare una più completa url in base a quello attuale.Il modo più semplice è quello di utilizzare {% url %} di nuovo, con alcune varianti.Dal momento che abbiamo denominato url, abbiamo bisogno di sapere come ottenere il nome dell'url che ha chiamato la vista corrente.

EDIT 2:un altro caso è quello di visualizzare le parti del template di base différently secondo il modello di base.Ci sono altri modi per farlo (con CSS e {% block %}, ma a volte è proprio bello essere in grado di rimuovere il tag di la voce di menu di base.html se il viewname partita il link.

È stato utile?

Soluzione

Non so per quanto tempo questa caratteristica ha fatto parte di Django, ma come il seguente mostra articolo , esso può essere realizzato come segue nella vista:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

Se avete bisogno che in ogni modello, scrivendo una richiesta di modello può essere appropriato.

Modifica: l'applicazione di nuove DJANGO UPDATE

A seguito dell'aggiornamento Django corrente:

Django 1.10 ( link )

  

L'importazione dal modulo django.core.urlresolvers è deprecato in   favore della sua nuova posizione, django.urls

Django 2.0 ( link )

  

Il modulo django.core.urlresolvers viene rimosso in favore della sua nuova   posizione, django.urls.

In questo modo, il modo giusto per farlo è come questo:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

Altri suggerimenti

Come di Django 1.5, questo può essere letta dall'oggetto request

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match

Per chi namespace loro modelli di URL, allora si può essere interessato al nome URL namespace della richiesta. In questo caso, Django chiamava view_name invece.

request.resolver_match.view_name

# return: <namespace>:<url name>

Questo può essere raggiunto attraverso:

request.resolver_match.url_name

Django> 1.8

Chiarimento della questione: "In una vista, come si fa a ottenere il nome di un URLPATTERN che punta ad esso, presumere che vi sia esattamente uno di questi URLPATTERN"

Questo può essere desiderabile per i motivi indicati: dalla visualizzazione, vogliamo un modo DRY di ottenere un URL per la stessa vista (non vogliamo avere a conoscere il nostro nome URLPATTERN)

.

Risposta breve:. Non è davvero abbastanza semplice per insegnare la classe, ma potrebbe essere una cosa divertente da fare per voi in un'ora o due e vomitare su GitHub

Se si voleva davvero fare questo, si dovrebbe creare una sottoclasse RegexURLResolver e modificare il metodo di determinazione di restituire il modello abbinato (da cui è possibile ottenere il nome del pattern) invece della vista e coppie parola chiave / valore. http://code.djangoproject.com/browser/ django / trunk / django / core / urlresolvers.py # L142

È quindi possibile creare un decoratore o forse più appropriatamente middleware che utilizza questa sottoclasse per ottenere il nome del modello e memorizzare tale valore da qualche parte nella richiesta in modo che le opinioni possono usarlo.

Se si vuole realmente farlo e si esegue attraverso qualche problema, fatemelo sapere e posso probabilmente aiutare.

Per la classe, vorrei solo farle hardcode il nome del pattern nella vista o modello. Credo che questo sia il modo accettabile di farlo.

Aggiornamento: Quanto più penso a questo, più mi sarei scoraggiare cercando di ottenere un nome URLPATTERN in una vista. parametri urlPattern sono abbastanza indipendente dai parametri della vista puntano. Se si vuole puntare a un certo URL, è necessario sapere come funziona il urlPattern, non solo come funziona la vista. Se avete bisogno di sapere come funziona l'URLPATTERN, si potrebbe anche essere necessario conoscere il nome del URLPATTERN.

E 'un po' poco chiaro dalla tua domanda, ma http://docs.djangoproject.com/en/dev/topics/http/urls/ sarà probabilmente fornire una spiegazione a ciò che che stai cercando.

Particolarmente utile notare come Django elabora le richieste:

Quando un utente richiede una pagina dal tuo sito Django-alimentato, questo è l'algoritmo del sistema segue per determinare quale codice Python per eseguire:

  1. Django determina il modulo radice URLconf da usare. Normalmente, questo è il valore dell'impostazione ROOT_URLCONF, ma se l'oggetto HttpRequest arrivo ha un attributo chiamato urlconf (impostato su richiesta middleware elaborazione), il suo valore viene utilizzato al posto dell'impostazione ROOT_URLCONF.
  2. carichi Django quel modulo Python e cerca l'urlpatterns variabili. Questo dovrebbe essere un elenco Python, nel formato restituito dalle django.conf.urls.defaults.patterns funzione ().
  3. Django attraversa ciascun pattern URL, in ordine, e si ferma al primo che corrisponde all'URL richiesto.
  4. Una volta che una delle regex corrisponde, importazioni Django e chiede la vista proposta, che è una funzione Python semplice. La vista viene passato un HttpRequest come primo argomento e tutti i valori acquisiti nel regolare come altri argomenti.

Se siete appena dopo il percorso completo, si può provare:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http .HttpRequest.get_full_path

Mi auguro che aiuta - indica come utilizzare il modulo URLconf, e speriamo vi aiuterà punto nella giusta direzione

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top