2010-05-21 14 views
225

Mi chiedevo come ottenere l'URL corrente all'interno di un modello.Come ottenere l'URL corrente all'interno di un modello Django?

Dire il mio URL è stato

/user/profile/ 

Come faccio a restituire questo al modello?

+2

possibile duplicato del [percorso di lettura nei template] (http://stackoverflow.com/questions/2127937/reading-path-in-templates) –

+2

Tutte le risposte sottostanti mi hanno fatto pensare che avevo bisogno di fare qualche ginnastica per avere accesso a 'request' in un template. In Django 1.10 accedo semplicemente a '{{request.path}}' nel template e funziona. Di default 'django.core.context_processors.request' è già configurato in settings.py se hai usato' startproject' – User

risposta

105

Django 1.9 e superiori:

## template 
{{ request.path }} 
{{ request.get_full_path }} 

Vecchio:

## settings.py 
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
) 

## views.py 
from django.template import * 

def home(request): 
    return render_to_response('home.html', {}, context_instance=RequestContext(request)) 

## template 
{{ request.path }} 
+2

Un po 'laconico, e non corretto. È 'render_to_response', e non' render_to_request'. E non puoi definire 'TEMPLATE_CONTEXT_PROCESSORS' come fai in settings.py, senza menzionare gli altri processori predefiniti che potrebbero essere usati nei template! – RedGlyph

+8

A partire dal 2016, non è più necessario aggiungere nulla a views.py. Finché django.core.context_processors.request viene caricato in TEMPLATE_CONTEXT_PROCESSORS - hai accesso a {{request.path}} dal modello. – Routhinator

+5

'request.path' non include parametri di query come'? Foo = bar'. Usa invece 'request.get_full_path'. – Flimm

264

È possibile recuperare l'URL nel modello come questo:

<p>URL of this page: {{ request.get_full_path }}</p> 

o

{{ request.path }} se si Non hai bisogno dei parametri extra.

Alcune precisioni e correzioni devono essere inviate a hypete's e Igancio's risposte, mi limiterò a riassumere l'intera idea qui, per riferimento futuro.

Se è necessario la variabile request nel modello, è necessario aggiungere il 'django.core.context_processors.request' per le impostazioni TEMPLATE_CONTEXT_PROCESSORS, non è di default (Django 1.4).

È inoltre necessario Non dimenticare gli altri processori di contesto utilizzati dalle applicazioni. Così, per aggiungere la richiesta agli altri processori di default, è possibile aggiungere questo nelle impostazioni, per evitare hard-codifica la lista processore standard (che può benissimo cambiare nelle versioni successive):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP 

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request', 
) 

Poi, a condizione si send the request contents in your response, per esempio come questo:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def index(request): 
    return render_to_response(
     'user/profile.html', 
     { 'title': 'User profile' }, 
     context_instance=RequestContext(request) 
    ) 
+4

Ho utilizzato una vista di classe generica estesa e non è stato necessario aggiungere 'request' al contesto. – Bobort

+0

Decisamente più pulito per evitare la codifica hard dell'elenco TCP, ma docs.djangoproject.com/en/dev/topics/settings/#default-settings dice: 'Nota che un file di impostazioni non deve importare da global_settings, perché è ridondante' – Medorator

+3

'return render (request, 'user/profile.html', {'title': 'Profilo utente'})' è più corto –

1

questa è una vecchia questione, ma può essere riassunta così facilmente come questo se si sta utilizzando django-registrazione.

Nel collegamento di accesso e disconnessione (diciamo nell'intestazione della pagina) aggiungere il prossimo parametro al collegamento che andrà ad accedere o uscire. Il tuo link dovrebbe assomigliare a questo.

<li><a href="http://www.noobmovies.com/accounts/login/?next={{ request.path | urlencode }}">Log In</a></li> 

<li><a href="http://www.noobmovies.com/accounts/logout/?next={{ request.path | urlencode }}">Log Out</a></li> 

che è semplicemente, niente altro deve essere fatto, su di disconnessione saranno immediatamente reindirizzati alla pagina sono a, per log in, saranno compilate il modulo e sarà quindi reindirizzare alla pagina che erano su Anche se provano erroneamente ad accedere, funziona ancora.

+3

dovresti codificare il percorso se si trova in un url: '{{request.path | urlencode}}' – Quentin

5

Nel modello di Django
ottenere semplicemente URL corrente dal {{request.path}}
Per ottenere URL completo con i parametri {{request.get_full_path}}

Nota: È necessario aggiungere request in Django TEMPLATE_CONTEXT_PROCESSORS

4

suppongo inviare al modello completo la richiesta è un po 'ridondante. Lo faccio in questo modo

def home(request): 
    app_url = request.path 
    return render(request, 'home.html', {'app_url': app_url}) 

##template 
{{ app_url }} 
2

Le altre risposte non erano corrette, almeno nel mio caso. request.path non fornisce l'url completo, ma solo l'url relativo, ad es. /paper/53. Non ho trovato alcuna soluzione adeguata, quindi ho finito per codificare la parte costante dell'URL nella vista prima di concatenarlo con request.path.

+0

Guarda la data. Le risposte sono state fornite 6 o 7 anni fa. – dotty

0

Le risposte sopra riportate sono corrette e danno una risposta grande e breve.

Sono stato anche alla ricerca di ottenere l'URL della pagina corrente nel modello di Django come la mia intenzione era quella di attivare HOME page, MEMBERS page, CONTACT page, ALL POSTS page quando vengono richiesti.

Sto incollando la parte dello snippet di codice HTML che potete vedere qui sotto per capire l'uso di request.path. Lo si può vedere nel mio live website a http://pmtboyshostelraipur.pythonanywhere.com/

<div id="navbar" class="navbar-collapse collapse"> 
    <ul class="nav navbar-nav"> 
     <!--HOME--> 
     {% if "/" == request.path %} 
     <li class="active text-center"> 
      <a href="/" data-toggle="tooltip" title="Home" data-placement="bottom"> 
      <i class="fa fa-home" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"> 
      </i> 
      </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
      <a href="/" data-toggle="tooltip" title="Home" data-placement="bottom"> 
      <i class="fa fa-home" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"> 
      </i> 
      </a> 
     </li> 
     {% endif %} 

     <!--MEMBERS--> 
     {% if "/members/" == request.path %} 
     <li class="active text-center"> 
     <a href="/members/" data-toggle="tooltip" title="Members" data-placement="bottom"> 
      <i class="fa fa-users" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
     </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
     <a href="/members/" data-toggle="tooltip" title="Members" data-placement="bottom"> 
      <i class="fa fa-users" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
     </a> 
     </li> 
     {% endif %} 

     <!--CONTACT--> 
     {% if "/contact/" == request.path %} 
     <li class="active text-center"> 
     <a class="nav-link" href="/contact/" data-toggle="tooltip" title="Contact" data-placement="bottom"> 
      <i class="fa fa-volume-control-phone" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
     <a class="nav-link" href="/contact/" data-toggle="tooltip" title="Contact" data-placement="bottom"> 
      <i class="fa fa-volume-control-phone" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% endif %} 

     <!--ALL POSTS--> 
     {% if "/posts/" == request.path %} 
     <li class="text-center"> 
     <a class="nav-link" href="/posts/" data-toggle="tooltip" title="All posts" data-placement="bottom"> 
      <i class="fa fa-folder-open" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% else %} 
     <li class="text-center"> 
     <a class="nav-link" href="/posts/" data-toggle="tooltip" title="All posts" data-placement="bottom"> 
      <i class="fa fa-folder-open" style="font-size:25px; padding-left: 5px; padding-right: 5px" aria-hidden="true"></i> 
      </a> 
     </li> 
     {% endif %} 
</ul> 

Problemi correlati