Come ottenere l'URL corrente all'interno di un modello Django?


309

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

Dì che il mio URL attuale è:

.../user/profile/

Come posso restituirlo al modello?


3
possibile duplicato del percorso
Mark Mikofski,

2
Tutte le risposte di seguito mi hanno fatto pensare che dovevo fare un po 'di ginnastica per accedere a requestun modello. In Django 1.10 ho solo accesso {{request.path}}al modello e funziona. Per impostazione predefinita django.core.context_processors.requestè già configurato in settings.py se hai utilizzatostartproject
Utente

Risposte:


232

Django 1.9 e versioni successive:

## template
{{ request.path }}  #  -without GET parameters 
{{ request.get_full_path }}  # - with GET parameters

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_responsee non render_to_request. E non puoi definire TEMPLATE_CONTEXT_PROCESSORScome 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,

8
request.pathnon include parametri di query come ?foo=bar. Usa request.get_full_pathinvece.
Flimm,

@Routhinator è d'accordo con te. ma è bello sapere che quei middleware devono essere inclusi per far sì che ciò accada.
Marshall X,

281

Puoi recuperare l'URL nel tuo modello in questo modo:

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

o da

{{ request.path }} se non hai bisogno di parametri extra.

Alcune precisazioni e correzioni dovrebbero essere apportate alle risposte dell'ipete e di Igancio , riassumerò qui l'intera idea, per riferimento futuro.

Se hai bisogno della requestvariabile nel modello, devi aggiungere 'django.core.context_processors.request' alle TEMPLATE_CONTEXT_PROCESSORSimpostazioni, non è di default (Django 1.4).

Inoltre, non dimenticare gli altri processori di contesto utilizzati dalle tue applicazioni. Quindi, per aggiungere la richiesta agli altri processori predefiniti, è possibile aggiungerlo nelle impostazioni, per evitare di codificare a fondo l'elenco di processori predefinito (che potrebbe 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',
)

Quindi, a condizione di inviare i requestcontenuti nella risposta , ad esempio come segue:

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 usato una vista di classe generica estesa ed è stato inutile aggiungere requestal contesto.
Bobort,

Decisamente più pulito per evitare la codifica forzata dell'elenco TCP, ma docs.djangoproject.com/en/dev/topics/settings/#default-settings dice:Note that a settings file should not import from global_settings, because that’s redundant
user

3
return render(request, 'user/profile.html', {'title': 'User profile'})è più corto
Richard de Wit il

2
ricordati di includere urlencode, ad esempio {{request.get_full_path|urlenode}}se stai reindirizzando
utente

come ottenere parametri da get_full_path ??
numerah,


6

Nel modello django
Ottieni semplicemente l'URL corrente da {{request.path}}
Per ottenere l'URL completo con i parametri{{request.get_full_path}}

Nota : è necessario aggiungere requestin DjangoTEMPLATE_CONTEXT_PROCESSORS


5

Suppongo che la richiesta di invio al modello sia leggermente ridondante. Lo faccio in questo modo

from django.shortcuts import render

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

##template
{{ app_url }}

4

Le altre risposte erano errate, almeno nel mio caso. request.pathnon 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 request.path.


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

3

Entrambi {{ request.path }} and {{ request.get_full_path }}restituiscono l'URL corrente ma non l'URL assoluto, ad esempio:

your_website.com/wallpapers/new_wallpaper

Entrambi torneranno /new_wallpaper/ (notare le barre iniziali e finali)

Quindi dovrai fare qualcosa del genere

{% if request.path == '/new_wallpaper/' %}
    <button>show this button only if url is new_wallpaper</button>
{% endif %}

Tuttavia, puoi ottenere l'URL assoluto utilizzando (grazie alla risposta sopra)

{{ request.build_absolute_uri }}

NOTA: non è necessario includere requestin settings.py, è già lì.


1

Questa è una vecchia domanda ma può essere riassunta facilmente se si utilizza la registrazione django.

Nel collegamento Accedi e Esci (diciamo nell'intestazione della pagina) aggiungi il parametro successivo al collegamento che andrà al login o al logout. Il tuo link dovrebbe apparire così.

<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>

È semplicemente tutto, non è necessario fare altro, al momento del logout verranno immediatamente reindirizzati alla pagina in cui si trovano, per il login compileranno il modulo e poi reindirizzeranno alla pagina in cui si trovavano. Anche se tentano erroneamente di accedere, funziona ancora.


3
dovresti codificare il percorso se è in un url:{{ request.path|urlencode }}
Quentin

0

Le risposte sopra 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 di attivare HOME page, MEMBERS page, CONTACT page, ALL POSTS pagequando sono richieste.

Sto incollando la parte dello snippet di codice HTML che puoi vedere di seguito per capire l'uso di request.path. Lo si può vedere nel mio live websitea 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>


2
Un piccolo suggerimento: se tutto ciò che stai facendo è verificare se aggiungere la activeclasse a ciascun lielemento, perché non farlo in linea all'interno di un lielemento: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>invece di un blocco if / else gigante per il tutto li? Ciò consentirebbe di risparmiare un sacco di codice ridondante :)
tatlar

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.