web-dev-qa-db-fra.com

Django: obtenir l'URL de la page actuelle, y compris les paramètres, dans un modèle

Existe-t-il un moyen d'obtenir l'URL de la page actuelle et tous ses paramètres dans un modèle Django?

Par exemple, un templatetag qui afficherait une URL complète comme /foo/bar?param=1&baz=2

56
Matt Hampel

Écrivez un processeur de contexte personnalisé. par exemple.

def get_current_path(request):
    return {
       'current_path': request.get_full_path()
     }

ajoutez un chemin d'accès à cette fonction dans votre TEMPLATE_CONTEXT_PROCESSORS variable de paramètres, et utilisez-la comme suit dans votre modèle:

{{ current_path }}

Si vous voulez avoir l'objet request complet dans chaque requête, vous pouvez utiliser le Django.core.context_processors.request processeur de contexte, puis utilisez {{ request.get_full_path }} dans votre modèle.

Voir:

71
Sam Dolan

Utilisez le processeur de contexte de Django pour obtenir la demande dans le contexte du modèle. Dans les paramètres, ajoutez request processeur à TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (

    # Put your context processors here

    'Django.core.context_processors.request',
)

Et dans l'utilisation du modèle:

{{ request.get_full_path }}

De cette façon, vous n'avez pas besoin d'écrire de nouveau code par vous-même.

22
Mariusz Jamro

Dans un fichier context_processors.py (ou similaire):

def myurl( request ):
  return { 'myurlx': request.get_full_path() }

Dans settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
  ...
  wherever_it_is.context_processors.myurl,
  ...

Dans votre template.html:

myurl={{myurlx}}
8
eruciform

En plus de la réponse de sdolan:

si vous utilisez I18N et souhaitez transmettre la valeur next à /i18n/setlang/ pour changer la langue de la page en cours, vous devrez alors supprimer le code de la langue actuelle du chemin complet. Quelque chose comme:

full_path = request.get_full_path()
current_path = full_path[full_path.index('/', 1):]

Cela suppose que chaque chemin a le format /LANG_CODE/any/other/stuff/with/?param='yay' et démarre simplement LANG_CODE quoi que ce soit (par exemple, /en/ se traduira par /).

1
oblalex

Vous pouvez voir si votre URL diffère des autres.

{% if 'foo/bar/' in request.get_full_path %}
1
sammarxz

Django a beaucoup de choses intégrées, mais si vous ne précisez pas ce que vous voulez utiliser, il ne sera pas utilisé.

Ainsi, dans le schéma MTV (modèle, modèle, vue), la vue reçoit une demande et utilise un rendu de modèle pour générer une réponse, en lui transmettant un dictionnaire ou toutes les variables locales (à l'aide de la fonction locals ()) de cette vue. Sachant cela, nous pouvons insérer l'URL actuelle issue de la réponse, comme ceci:

views.py:

from Django.shortcuts import render

def page(request):
    currentUrl = request.get_full_path()
    return render(request, 'app/page.html', locals())

Ensuite, dans le modèle 'app/page.html', il vous suffit de faire ce qui suit pour afficher la variable currentUrl que nous venons de créer et que nous avons transmise via locals ():

app/template/page.html:

{{ currentUrl }}
1
Rafael Lopes