How to get URL of current page, including parameters, in a template?
Is there a way to get the current page 开发者_开发知识库URL and all its parameters in a Django template?
For example, a templatetag that would print a full URL like /foo/bar?param=1&baz=2
Write a custom context processor. e.g.
def get_current_path(request):
return {
'current_path': request.get_full_path()
}
add a path to that function in your TEMPLATE_CONTEXT_PROCESSORS
settings variable, and use it in your template like so:
{{ current_path }}
If you want to have the full request
object in every request, you can use the built-in django.core.context_processors.request
context processor, and then use {{ request.get_full_path }}
in your template.
See:
- Custom Context Processors
- HTTPRequest's get_full_path() method.
Use Django's build in context processor to get the request in template context. In settings add request
processor to TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
# Put your context processors here
'django.core.context_processors.request',
)
And in template use:
{{ request.get_full_path }}
This way you do not need to write any new code by yourself.
In a file context_processors.py (or the like):
def myurl( request ):
return { 'myurlx': request.get_full_path() }
In settings.py:
TEMPLATE_CONTEXT_PROCESSORS = (
...
wherever_it_is.context_processors.myurl,
...
In your template.html:
myurl={{myurlx}}
If we are acessing the following URL: http://127.0.0.1:8000/home/?q=test
then
request.path = '/home/'
request.get_full_path() = '/home/?q=test'
request.build_absolute_uri() = 'http://127.0.0.1:8000/home/?q=test'
In addtition to sdolan's answer:
if you are using I18N and would like to pass next
value to /i18n/setlang/
to change the language of the current page, then you will need to strip off current language code from the full path either. Something like:
full_path = request.get_full_path()
current_path = full_path[full_path.index('/', 1):]
This assumes that every path has format /LANG_CODE/any/other/stuff/with/?param='yay'
and simply kicks off LANG_CODE
whatever it is (e.g., /en/
will result into /
).
You can see if your url differs from the others.
{% if 'foo/bar/' in request.get_full_path %}
Django has a lot of built-in stuff, but if you don't explicit what do you want to use, it won't be used.
So, in MTV schema (Model, Template, View) the view receives a request and uses a template render to generate a response, passing on it a dictionary or all local variables (using the locals() function) of this view. Knowing this, we can insert the current url that came from the response, like this:
views.py:
from django.shortcuts import render
def page(request):
currentUrl = request.get_full_path()
return render(request, 'app/page.html', locals())
Then, in the template 'app/page.html' you just have to do the following to display the currentUrl variable that we just created and passed through via locals():
app/template/page.html:
{{ currentUrl }}
精彩评论