How to get the current URL within a Django template?
Asked Answered
M

16

402

I was wondering how to get the current URL within a template.

Say my current URL is:

.../user/profile/

How do I return this to the template?

Metropolitan answered 21/5, 2010 at 13:34 Comment(2)
possible duplicate of Reading path in templatesLoch
All the below answers made me think I needed to do some gymnastics to get access to request in a template. In Django 1.10 I just access {{request.path}} in the template and it works. By default django.core.context_processors.request is already configured in settings.py if you used startprojectErund
H
370

Django 1.9 and above:

## template
{{ request.path }}  #  -without GET parameters 
{{ request.get_full_path }}  # - with GET parameters

Old:

## 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 }}
Handicraftsman answered 8/12, 2011 at 13:53 Comment(5)
A bit laconic, and not correct. It's render_to_response, and not render_to_request. And you can't define TEMPLATE_CONTEXT_PROCESSORS as you do in settings.py, without mentioning the other default processors that may well be used in the templates!Triennial
As of 2016, you no longer need to add anything to views.py. As long as django.core.context_processors.request is loaded in TEMPLATE_CONTEXT_PROCESSORS - you have access to {{ request.path }} from the template.Altagraciaaltaic
request.path does not include query parameters like ?foo=bar. Use request.get_full_path instead.Sialkot
@Altagraciaaltaic agree with you. but it's nice to know that those middleware needs to be included to make this happen.Isabea
As commented in other answers by @Quentin and @user you should include urlencode if you plan to use it in a link, typically: .../accounts/login?next={{ request.get_full_path | urlencode }}...Supercargo
T
305

You can fetch the URL in your template like this:

<p>URL of this page: {{ request.get_full_path }}</p>

or by

{{ request.path }} if you don't need the extra parameters.

Some precisions and corrections should be brought to hypete's and Igancio's answers, I'll just summarize the whole idea here, for future reference.

If you need the request variable in the template, you must add the 'django.core.context_processors.request' to the TEMPLATE_CONTEXT_PROCESSORS settings, it's not by default (Django 1.4).

You must also not forget the other context processors used by your applications. So, to add the request to the other default processors, you could add this in your settings, to avoid hard-coding the default processor list (that may very well change in later versions):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)

Then, provided you send the request contents in your response, for example as this:

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)
    )
Triennial answered 15/4, 2012 at 14:3 Comment(7)
I used an extended generic class view, and it was unnecessary to add request to the context.Skyline
Definitely cleaner to avoid hard coding the TCP list, but docs.djangoproject.com/en/dev/topics/settings/#default-settings says : Note that a settings file should not import from global_settings, because that’s redundantPaleolith
return render(request, 'user/profile.html', {'title': 'User profile'}) is shorterKnew
remember to include urlencode i.e. {{request.get_full_path|urlenode}} if you are redirectingPaleolith
how to get parameters from get_full_path ??Magnetoelectricity
@Paleolith Why do we need to use urlenode? If I use it like this: request.build_absolute_uri|urlencode, I get this: http://127.0.0.1:8000/2020/8/8/http%3A//127.0.0.1%3A8000/2020/8/8/just-a-test-post and without it I get normal http://127.0.0.1:8000/2020/8/8/just-a-test-postMaihem
Indeed, I see no need to use urlencode (it is urlencode, not urlenode) since this is already an URL. It would escape characters that mustn't be.Triennial
L
44

The below code helps me:

 {{ request.build_absolute_uri }}
Lustig answered 12/11, 2019 at 6:37 Comment(2)
This is useful, as it includes hostname/domain as well.Hindi
and that is the required one for complete path or linkLanguid
S
19

Both {{ request.path }} and {{ request.get_full_path }} return the current URL but not absolute URL, for example:

your_website.com/wallpapers/new_wallpaper

Both will return /new_wallpaper/ (notice the leading and trailing slashes)

So you'll have to do something like

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

However, you can get the absolute URL using (thanks to the answer above)

{{ request.build_absolute_uri }}

NOTE: you don't have to include requests in settings.py, it's already there.

Stuffed answered 16/11, 2019 at 14:15 Comment(0)
W
6

In django template
Simply get current url from {{request.path}}
For getting full url with parameters {{request.get_full_path}}

Note: You must add request in django TEMPLATE_CONTEXT_PROCESSORS

Waylan answered 15/1, 2016 at 7:25 Comment(0)
R
6

I suppose send to template full request is little bit redundant. I do it this way

from django.shortcuts import render

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

##template
{{ app_url }}
Ruble answered 19/10, 2016 at 16:23 Comment(0)
G
4

The other answers were incorrect, at least in my case. request.path does not provide the full url, only the relative url, e.g. /paper/53. I did not find any proper solution, so I ended up hardcoding the constant part of the url in the View before concatenating it with request.path.

Gormand answered 13/6, 2017 at 1:33 Comment(1)
Look at the date. The answers were given 6 or 7 years ago.Metropolitan
F
3

For Django > 3 I do not change settings or anything. I add the below code in the template file.

{{ request.path }}  #  -without GET parameters 
{{ request.get_full_path }}  # - with GET parameters

and in view.py pass request variable to the template file.

view.py:

def view_node_taxon(request, cid):
    showone = get_object_or_404(models.taxon, id = cid)
    context = {'showone':showone,'request':request}
    mytemplate  = loader.get_template('taxon/node.html')
    html = mytemplate.render(context)
    return HttpResponse(html)
Fisticuffs answered 2/11, 2020 at 10:1 Comment(0)
G
3

You can get the url without parameters by using {{request.path}} You can get the url with parameters by using {{request.get_full_path}}

Greenman answered 18/12, 2020 at 16:34 Comment(0)
O
3

if you are using render partial it's better to use

{{ request.path_info }}

It returns the exact url of the page

Overfill answered 21/8, 2021 at 16:2 Comment(1)
How can this be coded in python code? I need the url inside a PDF, not htmlProa
M
1

This is an old question but it can be summed up as easily as this if you're using django-registration.

In your Log In and Log Out link (lets say in your page header) add the next parameter to the link which will go to login or logout. Your link should look like this.

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

That's simply it, nothing else needs to be done, upon logout they will immediately be redirected to the page they are at, for log in, they will fill out the form and it will then redirect to the page that they were on. Even if they incorrectly try to log in it still works.

Mistranslate answered 18/1, 2015 at 20:48 Comment(1)
you should encode the path if it is in a url: {{ request.path|urlencode }}Zionism
V
1

Above answers are correct and they give great and short answer.

I was also looking for getting the current page's url in Django template as my intention was to activate HOME page, MEMBERS page, CONTACT page, ALL POSTS page when they are requested.

I am pasting the part of the HTML code snippet that you can see below to understand the use of request.path. You can see it in my live website at 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>

Vachon answered 31/12, 2017 at 1:4 Comment(1)
A small suggestion -- if all you are doing is checking whether to add the active class to each li element, why not just do that inline within one li element: <li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li> instead of a giant if/else block for the whole li? That would save a whole bunch of redundant code :)Delozier
M
0

In Django 3, you want to use url template tag:

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

For an example, see the documentation

Mllly answered 16/6, 2020 at 23:57 Comment(0)
S
0

Use example:

 <!-- BRAND -->
        <div class="brand">
            <div class="logo">
                {% if request.get_full_path == '/' %}
                    <a href="{% url 'front:homepage' %}" class="first-logo big-logo">
                        <img src="{% static 'assets/images/logo-big.svg' %}"
                             alt="pozitiv">
                    </a>

                    <a href="{% url 'front:homepage' %}" class="second-logo mobile-logo">
                        <img src="{% static 'assets/images/logo.svg' %}"
                             alt="<?php echo WEBSITE_NAME; ?>" >
                    </a>

                {% else %}

                    <a href="{% url 'front:homepage' %}">
                        <img src="{% static 'assets/images/logo.svg' %}"
                             alt="<?php echo WEBSITE_NAME; ?>" style="width: 320px; margin: -20px 0 0 0;">
                    </a>
                {% endif %}
            </div>
        </div>
Slacken answered 19/5, 2021 at 11:39 Comment(0)
A
0

To pass the get parameter to template, you can pass it via views.py file

Example:

return render(request, 'test.html',{'get_parameter_name' : get_parameter_value})

And use in template like:

{{get_parameter_name}}
Aberdeen answered 9/12, 2021 at 11:17 Comment(0)
N
0

If you are using js in the template as well, you can do this:
In you js

document.addEventListener('DOMContentLoaded', function() {
    ...
    getUrl();
}

function getUrl() {
    let someDiv = document.querySelector(`#someDiv`);
    someDiv.innerHTML = window.location.href;
}

for your template

...
<div id="someDiv"><div>
...
Neisa answered 2/3, 2022 at 11:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.