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

309

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

Supposons que mon URL actuelle soit:

.../user/profile/

Comment puis-je retourner cela au modèle?

dingue
la source
3
doublon possible du chemin
Mark Mikofski
2
Toutes les réponses ci-dessous m'ont fait penser que je devais faire de la gymnastique pour avoir accès à requestun modèle. Dans Django 1.10, j'accède simplement {{request.path}}au modèle et cela fonctionne. Par défaut, il django.core.context_processors.requestest déjà configuré dans settings.py si vous l'avez utiliséstartproject
Utilisateur

Réponses:

232

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 }}
httpete
la source
2
Un peu laconique, et pas correct. C'est render_to_responseet non render_to_request. Et vous ne pouvez pas définir TEMPLATE_CONTEXT_PROCESSORScomme vous le faites dans settings.py, sans mentionner les autres processeurs par défaut qui pourraient bien être utilisés dans les modèles!
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 du
8
request.pathn'inclut pas les paramètres de requête comme ?foo=bar. Utilisez request.get_full_pathplutôt.
Flimm
@Routhinator est d'accord avec vous. mais il est bon de savoir que ces middlewares doivent être inclus pour que cela se produise.
Marshall X
281

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 d' Hypete et d' Igancio , je résumerai simplement l'idée ici, pour référence future.

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

Vous ne devez pas non plus oublier les autres processeurs de contexte utilisés par vos applications. Donc, pour ajouter la demande aux autres processeurs par défaut, vous pouvez l'ajouter dans vos paramètres, pour éviter de coder en dur la liste des processeurs par défaut (qui 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 d' envoyer le requestcontenu 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)
    )
RedGlyph
la source
4
J'ai utilisé une vue de classe générique étendue et il n'était pas nécessaire de l'ajouter requestau contexte.
Bobort
Certainement plus propre pour éviter de coder en dur la liste TCP, mais docs.djangoproject.com/en/dev/topics/settings/#default-settings dit:Note that a settings file should not import from global_settings, because that’s redundant
utilisateur
3
return render(request, 'user/profile.html', {'title': 'User profile'})est plus court
Richard de Wit
2
n'oubliez pas d'inclure urlencode, c'est-à {{request.get_full_path|urlenode}}- dire si vous redirigez
utilisateur
comment obtenir les paramètres de get_full_path ??
numerah
7

Le code ci-dessous m'aide:

 {{ request.build_absolute_uri }}
Евгений Шабин
la source
Ceci est utile, car il inclut également le nom d'hôte / domaine.
waverider
6

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

Remarque : vous devez ajouter requestdans djangoTEMPLATE_CONTEXT_PROCESSORS

Savad KP
la source
5

Je suppose que l'envoi au modèle de demande complète est un peu redondant. Je le fais de cette façon

from django.shortcuts import render

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

##template
{{ app_url }}
Radren
la source
4

Les autres réponses étaient incorrectes, du moins dans mon cas. request.pathne fournit pas l'URL complète, seulement l'URL relative, par exemple /paper/53. Je n'ai trouvé aucune 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 request.path.

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

Les deux {{ request.path }} and {{ request.get_full_path }}renvoient l'URL actuelle mais pas l'URL absolue, par exemple:

your_website.com/wallpapers/new_wallpaper

Les deux reviendront /new_wallpaper/ (notez les barres obliques de début et de fin)

Vous devrez donc faire quelque chose comme

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

Cependant, vous pouvez obtenir l'URL absolue en utilisant (grâce à la réponse ci-dessus)

{{ request.build_absolute_uri }}

REMARQUE: vous ne devez pas inclure requestdans settings.py, il est déjà là.

Mujeeb Ishaque
la source
1

C'est une vieille question mais elle peut être résumée aussi facilement que celle-ci si vous utilisez django-registration.

Dans votre lien de connexion et de déconnexion (disons dans l'en-tête de votre page), ajoutez le paramètre suivant au lien qui ira à la connexion ou à la déconnexion. 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, rien d'autre ne doit être fait, à la déconnexion, ils seront immédiatement redirigés vers la page où ils se trouvent, pour se connecter, ils rempliront le formulaire et il redirigera ensuite vers la page sur laquelle ils se trouvaient. Même s'ils essaient incorrectement de se connecter, cela fonctionne toujours.

Chris Hawkes
la source
3
vous devez encoder le chemin s'il est dans une URL:{{ request.path|urlencode }}
Quentin
0

Les réponses ci-dessus sont correctes et elles donnent une bonne et courte réponse.

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

hygull
la source
2
Une petite suggestion - si tout ce que vous faites est de vérifier s'il faut ajouter la activeclasse à chaque liélément, pourquoi ne pas simplement le faire en ligne dans un liélément: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>au lieu d'un bloc if / else géant pour l'ensemble li? Cela sauverait tout un tas de code redondant :)
tatlar
0

Dans Django 3, vous souhaitez utiliser la balise de modèle d' URL :

{% url 'name-of-your-user-profile-url' possible_context_variable_parameter %}

Pour un exemple, voir la documentation

Janne
la source