2010-05-21 9 views
225

Je me demandais comment obtenir l'URL actuelle dans un modèle.Comment obtenir l'URL actuelle dans un template Django?

Dis mon URL était

/user/profile/ 

Comment puis-je retourner ce au modèle?

+2

double possible de [chemin lecture dans les modèles] (http://stackoverflow.com/questions/2127937/reading-path-in-templates) –

+2

Toutes les réponses ci-dessous m'ont fait penser que je devais faire de la gymnastique pour avoir accès à 'request' dans un template. Dans Django 1.10, j'accède juste '{{request.path}}' dans le template et ça marche. Par défaut 'django.core.context_processors.request' est déjà configuré dans settings.py si vous avez utilisé' startproject' – User

Répondre

105

Django 1.9 et au-dessus:

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

Vieux:

## 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 peu laconique, et pas correct. C'est 'render_to_response', et non' render_to_request'. Et vous ne pouvez pas définir 'TEMPLATE_CONTEXT_PROCESSORS' comme vous le faites dans settings.py, sans mentionner les autres processeurs par défaut qui pourraient bien être utilisés dans les templates! – RedGlyph

+8

Depuis 2016, vous n'avez plus besoin d'ajouter quoi que ce soit à views.py. Tant que django.core.context_processors.request est chargé dans TEMPLATE_CONTEXT_PROCESSORS - vous avez accès à {{request.path}} à partir du modèle. – Routhinator

+5

'request.path' n'inclut pas les paramètres de requête tels que'? Foo = bar'. Utilisez 'request.get_full_path' à la place. – Flimm

264

Vous pouvez chercher l'URL dans votre modèle comme celui-ci:

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

ou par

{{ request.path }} si y Vous n'avez pas besoin des paramètres supplémentaires.

Certaines précisions et corrections doivent être apportées à hypete's et Igancio's réponses, je vais résumer l'idée ici, pour référence future.

Si vous avez besoin de la variable request dans le modèle, vous devez ajouter le « django.core.context_processors.request » aux TEMPLATE_CONTEXT_PROCESSORS paramètres, ce n'est pas par défaut (Django 1.4).

Vous devez également de ne pas oublier les autres processeurs de contexte utilisés par vos applications. Donc, pour ajouter la demande aux autres processeurs par défaut, vous pouvez ajouter dans vos paramètres, afin d'éviter coder en dur la liste des processeurs par défaut (qui peut très bien changer dans les versions ultérieures):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP 

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

Ensuite, à condition vous send the request contents in your response, par exemple comme ceci:

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

J'ai utilisé une vue de classe générique étendue, et il n'était pas nécessaire d'ajouter 'request' au contexte. – Bobort

+0

Nettement plus propre à éviter de coder en dur la liste TCP, mais docs.djangoproject.com/fr/dev/topics/settings/#default-settings dit: 'Notez qu'un fichier de paramètres ne doit pas être importé depuis global_settings, parce que c'est redondant' – Medorator

+3

'return render (request, 'utilisateur/profile.html', {'title': 'Profil utilisateur'})' est plus court –

1

C'est une vieille question, mais il peut se résumer aussi facilement que si vous utilisez django-inscription.

Dans votre lien Connexion et déconnexion (disons dans l'en-tête de votre page), ajoutez le paramètre suivant au lien qui va se connecter ou se déconnecter. Votre lien devrait ressembler à ceci.

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

qui est tout simplement, rien d'autre a besoin d'être fait, lors de la déconnexion, ils seront immédiatement redirigés vers la page qu'ils sont à, pour journal, ils rempliront le formulaire et il sera alors redirigé vers la page qu'ils étaient allumés. Même s'ils tentent incorrectement de se connecter, cela fonctionne toujours.

+3

vous devriez encoder le chemin s'il est dans un URL: '{{request.path | urlencode}}' – Quentin

5

dans le modèle de django
obtenir simplement l'URL actuelle de {{request.path}}
Pour obtenir url complète avec les paramètres {{request.get_full_path}}

Remarque: Vous devez ajouter request dans django TEMPLATE_CONTEXT_PROCESSORS

4

Je suppose envoyer à Modèle complet La requête est un peu redondante. Je le fais de cette façon

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

##template 
{{ app_url }} 
2

Les autres réponses étaient incorrectes, au moins dans mon cas. request.path ne fournit pas l'URL complète, seulement l'URL relative, par ex. /paper/53. Je n'ai pas trouvé de solution appropriée, donc j'ai fini par coder en dur la partie constante de l'URL dans la vue avant de la concaténer avec request.path.

+0

Regardez la date. Les réponses ont été données il y a 6 ou 7 ans. – dotty

0

Les réponses ci-dessus sont correctes et donnent une réponse rapide.

Je cherchais aussi pour obtenir l'URL de la page en cours dans le modèle Django que mon intention était d'activer HOME page, MEMBERS page, CONTACT page, ALL POSTS page lorsqu'ils sont demandés.

Je colle la partie de l'extrait de code HTML que vous pouvez voir ci-dessous pour comprendre l'utilisation de request.path. Vous pouvez le voir dans mon live website à 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> 

Questions connexes