ChatGPT解决这个技术问题 Extra ChatGPT

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

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

假设我当前的网址是:

.../user/profile/

如何将此返回到模板?

Reading path in templates 的可能重复项
以下所有答案让我觉得我需要做一些体操才能访问模板中的 request。在 Django 1.10 中,我只需访问模板中的 {{request.path}} 即可。如果您使用 startproject,默认情况下 django.core.context_processors.request 已在 settings.py 中配置

A
Aleksei Khatkevich

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

有点简洁,不正确。它是 render_to_response,而不是 render_to_request。而且您不能像在 settings.py 中那样定义 TEMPLATE_CONTEXT_PROCESSORS,而无需提及模板中可能使用的其他默认处理器!
自 2016 年起,您不再需要向 views.py 添加任何内容。只要 django.core.context_processors.request 在 TEMPLATE_CONTEXT_PROCESSORS 中加载 - 您就可以从模板访问 {{ request.path }}。
request.path 不包括像 ?foo=bar 这样的查询参数。请改用 request.get_full_path
@Routhinator 同意你的看法。但很高兴知道需要包含这些中间件才能实现这一点。
正如@Quentin 和@user 在其他答案中所评论的那样,如果您打算在链接中使用它,则应包含 urlencode,通常:.../accounts/login?next={{ request.get_full_path | urlencode }}...
R
RedGlyph

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

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

或通过

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

hypete'sIgancio's的答案应该进行一些精确和更正,我将在这里总结整个想法,以供将来参考。

如果您需要模板中的 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',
)

然后,为您提供 send the request contents in your response,例如:

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

我使用了扩展的通用类视图,没有必要将 request 添加到上下文中。
绝对干净,以避免硬编码 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
return render(request, 'user/profile.html', {'title': 'User profile'}) 更短
如果您要重定向,请记住包含 urlencode 即 {{request.get_full_path|urlenode}}
如何从 get_full_path 获取参数?
A
Angel F Syrus

下面的代码对我有帮助:

 {{ request.build_absolute_uri }}

这很有用,因为它还包括主机名/域。
这是完整路径或链接所必需的
C
Community

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

注意:您不必在 settings.py 中包含 request,它已经存在。


S
Savad KP

在 django 模板中
只需从 {{request.path}}
获取当前 url 获取带有参数 {{request.get_full_path}} 的完整 url

注意:必须在 django 中添加 request TEMPLATE_CONTEXT_PROCESSORS


K
Kalob Taulien

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

from django.shortcuts import render

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

##template
{{ app_url }}

C
CoderGuy123

至少在我的情况下,其他答案是不正确的。 request.path 不提供完整的 url,只提供相对 url,例如 /paper/53。我没有找到任何合适的解决方案,因此在将其与 request.path 连接之前,我最终在 View 中对 URL 的常量部分进行了硬编码。


看日期。答案是 6 或 7 年前给出的。
H
Hamed Shiani

如果您使用的是部分渲染,最好使用

{{ request.path_info }}

它返回页面的确切 url


R
Raj Kalathiya

您可以使用 {{request.path}} 获取不带参数的 url 您可以使用 {{request.get_full_path}} 获取带参数的 url


F
Flimm

这是一个老问题,但如果您使用 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>

就是这样,不需要做任何其他事情,注销后他们将立即重定向到他们所在的页面,登录时,他们将填写表格,然后重定向到他们所在的页面。即使他们错误地尝试登录它仍然有效。


如果路径在 url 中,您应该对路径进行编码:{{ request.path|urlencode }}
h
hygull

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

我还在寻找在 Django 模板中获取当前页面的 url,因为我的意图是在请求时激活 HOME pageMEMBERS pageCONTACT pageALL POSTS page

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


一个小建议 - 如果您所做的只是检查是否将 active 类添加到每个 li 元素,为什么不直接在一个 li 元素中内联:<li class="{% if "/contact/" == request.path %}active {% endif %}text-center">....</li> 而不是巨大的 if/else阻止整个 li?这将节省一大堆冗余代码:)
D
Darwin

对于 Django > 3,我不会更改设置或任何东西。我在模板文件中添加以下代码。

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

并在 view.py 中将请求变量传递给模板文件。

视图.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)

J
Janne

在 Django 3 中,您想使用 url 模板标签:

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

例如,see the documentation


S
Serhii Zelenchuk

使用示例:

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

W
Walk

要将 get 参数传递给模板,您可以通过 views.py 文件传递它

例子:

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

并在模板中使用,例如:

{{get_parameter_name}}

o
onapte

如果你也在模板中使用 js,你可以这样做: In you js

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

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

为您的模板

...
<div id="someDiv"><div>
...