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
É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:
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.
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}}
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 /
).
Vous pouvez voir si votre URL diffère des autres.
{% if 'foo/bar/' in request.get_full_path %}
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 }}