2010-07-14 14 views
44

Existe-t-il un moyen d'obtenir l'URL de la page actuelle et tous ses paramètres dans un modèle Django?Django: obtenir l'URL de la page en cours, y compris les paramètres, dans un modèle

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

+0

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

+0

un autre double possible est [Obtenir l'URL actuelle withing un modèle Django ] (http://stackoverflow.com/questions/2882490/get-the-current-url-within-a-django-template) –

Répondre

58

Ecrivez un processeur de contexte personnalisé. par exemple.

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

ajouter un chemin à cette fonction dans vos variables paramètres TEMPLATE_CONTEXT_PROCESSORS, et l'utiliser dans votre modèle comme ceci:

{{ current_path }} 

Si vous voulez avoir la pleine objet request à chaque demande, vous pouvez utilisez le processeur de contexte django.core.context_processors.request intégré, puis utilisez {{ request.get_full_path }} dans votre modèle.

Voir:

+2

N'oubliez pas d'utiliser urlencode ie '{{request.get_full_path | urlencode}}' si vous en avez besoin pour la redirection – Medorator

6

Dans un context_processors.py de fichier (ou similaire):

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

En settings.py:

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

Dans votre modèle.html:

myurl={{myurlx}} 
+0

Désolé, downvoted par erreur .. s'il vous plaît faire une modification afin que je puisse annuler cela. –

1

Django a beaucoup de choses intégré, mais si vous ne le faites pas explicitement ce que vous voulez utiliser, il a gagné » t être utilisé. Ainsi, dans MTV schema (Model, Template, View) la vue reçoit une requête et utilise un template render pour générer une réponse, en lui transmettant un dictionnaire ou toutes les variables locales (en utilisant la fonction local()) de cette vue. Sachant cela, nous pouvons insérer l'URL actuelle qui venait 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 traversions par la population locale():

app/template/page.html:

{{ currentUrl }} 
1

en addtition à la réponse de sdolan:

si vous utilisez I18N et que vous souhaitez passer la valeur next à /i18n/setlang/ pour changer la langue de la page en cours, vous devrez alors supprimer le code de langue actuel du chemin d'accès 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 coups de pied tout simplement hors LANG_CODE quoi que ce soit (par exemple, /en/ se traduira en /).

20

Utilisez la construction de Django dans le processeur de contexte pour obtenir la requête dans un contexte de modèle. Dans les paramètres ajouter 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 tout nouveau code par vous-même.

+1

Il est à noter que l'utilisation de cette méthode écrase le paramètre TEMPLATE_CONTEXT_PROCESSORS par défaut, vous devrez donc les ajouter à la liste . [Les docs] (https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS) ont une liste des valeurs par défaut à inclure dans la liste. – carruthd

0

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

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