web-dev-qa-db-fra.com

Comment obtenir l'URL actuelle dans un modèle Django?

Je me demandais comment obtenir l'URL actuelle dans un modèle.

Dites que mon URL actuelle est:

.../user/profile/

Comment puis-je renvoyer ceci au modèle?

281
dotty

Django 1.9 et supérieur:

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

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 }}
185
httpete

Vous pouvez récupérer l'URL dans votre modèle comme ceci:

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

ou par

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

Quelques précisions et corrections devraient être apportées aux réponses hypete et Igancio , je vais simplement résumer toute 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' au TEMPLATE_CONTEXT_PROCESSORS paramètres, ce n'est pas par défaut (Django 1.4).

Vous devez également 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 ceci dans vos paramètres, pour éviter de coder en dur la liste des processeurs par défaut (cela pourrait 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 que vous envoyez le contenu de request dans votre réponse , 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)
    )
_
277
RedGlyph

Je suppose que la demande complète d'envoi au modèle 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 }}
5
Radren

Dans le modèle Django
Il suffit d’obtenir l’URL actuelle de {{request.path}}
Pour obtenir une URL complète avec les paramètres {{request.get_full_path}}

Note: Vous devez ajouter request dans Django TEMPLATE_CONTEXT_PROCESSORS

5
Savad KP

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

3
Deleet

C'est une vieille question, mais elle peut être résumée aussi facilement si vous utilisez l'enregistrement Django.

Dans votre lien de connexion et déconnexion (ajoutons dans l'en-tête de votre page), ajoutez le paramètre suivant au lien qui vous permettra de vous connecter ou de vous 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>

C’est tout simplement, il n’ya rien d’autre à faire. À la fermeture de session, ils seront immédiatement redirigés vers la page où ils se trouvent. Pour se connecter, ils rempliront le formulaire, qui sera redirigé vers la page sur laquelle ils étaient. Même s'ils essaient de se connecter incorrectement, cela fonctionne toujours.

1
Chris Hawkes

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

Je cherchais également à obtenir l'URL de la page actuelle dans le modèle Django, car mon intention était d'activer HOME page, MEMBERS page, CONTACT page, ALL POSTS page quand 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 à l'adresse 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>
0
hygull