如何在 Django 模板中获取当前 URL?
Posted
技术标签:
【中文标题】如何在 Django 模板中获取当前 URL?【英文标题】:How to get the current URL within a Django template? 【发布时间】:2011-02-22 08:58:27 【问题描述】:我想知道如何在模板中获取当前 URL。
假设我当前的网址是:
.../user/profile/
如何将其返回到模板?
【问题讨论】:
Reading path in templates的可能重复 以下所有答案让我觉得我需要做一些体操才能在模板中访问request
。在 Django 1.10 中,我只需在模板中访问 request.path
即可。默认情况下,django.core.context_processors.request
已经在 settings.py 中配置,如果你使用了startproject
【参考方案1】:
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 ...
【参考方案2】:
您可以像这样在模板中获取 URL:
<p>URL of this page: request.get_full_path </p>
或通过
request.path
如果您不需要额外的参数。
应该对hypete's和Igancio'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获取参数??【参考方案3】:
这是一个老问题,但如果您使用 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
【参考方案4】:
在django模板中
只需从request.path
获取当前网址
获取带参数的完整网址request.get_full_path
注意:
您必须在 django 中添加request
TEMPLATE_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
【讨论】:
【参考方案6】:至少在我的情况下,其他答案不正确。 request.path
不提供完整的 url,只提供相对 url,例如/paper/53
。我没有找到任何合适的解决方案,所以我最终在视图中硬编码了 URL 的常量部分,然后将其与 request.path
连接起来。
【讨论】:
看日期。答案是 6 或 7 年前给出的。【参考方案7】:以上答案是正确的,它们给出了很好的简短答案。
我也在寻找在 Django 模板中获取当前页面的 url,因为我的意图是在请求时激活 HOME page
、MEMBERS page
、CONTACT page
、ALL POSTS page
。
我把下面的部分HTML代码sn-p贴上来,了解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
元素中内联:@987654332 @ 而不是整个 li
的巨大 if/else 块?这将节省一大堆冗余代码:)【参考方案8】:
下面的代码对我有帮助:
request.build_absolute_uri
【讨论】:
这很有用,因为它还包括主机名/域。 这是完整路径或链接所必需的【参考方案9】: 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
,它已经存在了。
【讨论】:
【参考方案10】:在 Django 3 中,你想使用url 模板标签:
% url 'name-of-your-user-profile-url' possible_context_variable_parameter %
例如,see the documentation
【讨论】:
【参考方案11】:对于 Django > 3 我不更改设置或任何东西。 我在模板文件中添加以下代码。
request.path # -without GET parameters
request.get_full_path # - with GET parameters
并在 view.py 中将 request 变量传递给模板文件。
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)
【讨论】:
【参考方案12】:可以通过 request.path 获取不带参数的url 您可以使用 request.get_full_path
获取带参数的 url【讨论】:
【参考方案13】:使用示例:
<!-- 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' %"
>
</a>
<a href="% url 'front:homepage' %" class="second-logo mobile-logo">
<img src="% static 'assets/images/logo.svg' %"
>
</a>
% else %
<a href="% url 'front:homepage' %">
<img src="% static 'assets/images/logo.svg' %"
style="width: 320px; margin: -20px 0 0 0;">
</a>
% endif %
</div>
</div>
【讨论】:
【参考方案14】:如果你使用的是部分渲染,最好使用
request.path_info
它返回页面的确切网址
【讨论】:
【参考方案15】:要将get参数传递给模板,
你可以通过views.py
文件传递它
例子:
return render(request, 'test.html','get_parameter_name' : get_parameter_value)
并在模板中使用:
get_parameter_name
【讨论】:
以上是关于如何在 Django 模板中获取当前 URL?的主要内容,如果未能解决你的问题,请参考以下文章