如何在Django模板中获取当前URL?


309

我想知道如何在模板中获取当前URL。

说我目前的网址是:

.../user/profile/

如何将此返回模板?



2
以下所有答案使我认为我需要做一些体操运动才能进入request模板。在Django 1.10中,我只需访问{{request.path}}模板即可使用。django.core.context_processors.request如果您使用的话,默认情况下已经在settings.py中进行了配置startproject
用户

Answers:


232

Django 1.9及更高版本:

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

旧:

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

2
有点陈词滥调,而且不正确。是render_to_response,不是render_to_request。而且,您不能TEMPLATE_CONTEXT_PROCESSORS像在settings.py中那样进行定义,而无需提及模板中可能使用的其他默认处理器!
RedGlyph 2012年

8
从2016年开始,您不再需要向views.py添加任何内容。只要在TEMPLATE_CONTEXT_PROCESSORS中加载了django.core.context_processors.request,您就可以从模板访问{{request.path}}。
Routhinator '16

8
request.path不包含的查询参数?foo=bar。使用request.get_full_path代替。
Flimm

@Routhinator同意你的观点。但是很高兴知道需要包括那些中间件才能实现这一目标。
马歇尔X

281

您可以像这样在模板中获取URL:

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

{{ request.path }} 如果您不需要额外的参数。

应该给hypeteIgancio的答案一些精确性和更正,在这里我将总结整个思想,以供将来参考。

如果您需要request模板中的变量,则必须将'django.core.context_processors.request'添加到TEMPLATE_CONTEXT_PROCESSORS设置中,默认情况下不是这样(Django 1.4)。

您也一定不要忘记您的应用程序使用的其他上下文处理器。因此,要将请求添加到其他默认处理器,可以在设置中添加此请求,以避免硬编码默认处理器列表(在以后的版本中可能会发生很大变化):

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

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

然后,假设您发送了request响应中的内容,例如:

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

4
我使用了扩展的泛型类视图,因此不必添加request到上下文中。
Bobort 2012年

绝对更干净,可以避免对TCP列表进行硬编码,但是docs.djangoproject.com/en/dev/topics/settings/#default-settings说:Note that a settings file should not import from global_settings, because that’s redundant
用户

3
return render(request, 'user/profile.html', {'title': 'User profile'})
理查德·德维特

2
记住要包括urlencode,即{{request.get_full_path|urlenode}}如果您要重定向
用户

如何从get_full_path获取参数?
numerah 2014年


6

在Django模板中,
只需从中获取当前网址即可{{request.path}}
获取具有参数的完整网址{{request.get_full_path}}

注意:您必须添加requestdjangoTEMPLATE_CONTEXT_PROCESSORS


5

我想发送到模板的完整请求有点多余。我这样

from django.shortcuts import render

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

##template
{{ app_url }}

4

至少在我看来,其他答案是错误的。request.path不提供完整网址,仅提供相对网址,例如/paper/53。我没有找到任何合适的解决方案,因此最终我在将View与URL串联之前,对URL中的常量部分进行了硬编码request.path


看日期。答案是在6或7年前给出的。

3

两者都{{ request.path }} and {{ request.get_full_path }}返回当前URL,但不返回绝对URL,例如:

your_website.com/wallpapers/new_wallpaper

两者都将返回/new_wallpaper/ (注意前斜杠和后斜杠)

所以你必须做类似的事情

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

但是,您可以使用来获得绝对URL(由于上面的答案)

{{ request.build_absolute_uri }}

注意:您不必包括requestsettings.py,它已经存在。


1

这是一个古老的问题,但是如果您使用的是django-registration,则可以像这样简单地总结一下。

在“登录和注销”链接(在页面标题中说)中,将下一个参数添加到链接中,以进行登录或注销。您的链接应如下所示。

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

就是这样,无需执行任何其他操作,注销后,它们将立即重定向到他们所在的页面,登录时,他们将填写该表单,然后它将重定向到他们所在的页面。即使他们错误地尝试登录,它仍然有效。


3
您应该对路径进行编码(如果它在URL中):{{ request.path|urlencode }}
Quentin

0

以上答案是正确的,它们给出了简短的答案。

我也一直在寻找获得当前页面的URL在Django模板作为我的意图是要激活HOME pageMEMBERS pageCONTACT pageALL POSTS page当被要求他们。

我正在粘贴HTML代码段的一部分,您可以在下面看到它,以了解的用法request.path。您可以live websitehttp://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>


2
一个小建议-如果您正在做的只是检查是否将active类添加到每个li元素,为什么不直接在一个li元素内进行内联:<li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li>而不是整个if / else块li?这样可以节省一大堆多余的代码:)
tatlar

0

在Django 3中,您要使用url 模板标记:

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

有关示例,请参阅文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.