我想知道如何在模板中获取当前 URL。
假设我当前的网址是:
.../user/profile/
如何将此返回到模板?
request
。在 Django 1.10 中,我只需访问模板中的 {{request.path}}
即可。如果您使用 startproject
,默认情况下 django.core.context_processors.request
已在 settings.py 中配置
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 }}
您可以像这样在模板中获取 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
添加到上下文中。
Note that a settings file should not import from global_settings, because that’s redundant
return render(request, 'user/profile.html', {'title': 'User profile'})
更短
{{request.get_full_path|urlenode}}
下面的代码对我有帮助:
{{ request.build_absolute_uri }}
{{ 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
,它已经存在。
在 django 模板中
只需从 {{request.path}}
获取当前 url 获取带有参数 {{request.get_full_path}}
的完整 url
注意:必须在 django 中添加 request
TEMPLATE_CONTEXT_PROCESSORS
我想发送到模板完整请求有点多余。我这样做
from django.shortcuts import render
def home(request):
app_url = request.path
return render(request, 'home.html', {'app_url': app_url})
##template
{{ app_url }}
至少在我的情况下,其他答案是不正确的。 request.path
不提供完整的 url,只提供相对 url,例如 /paper/53
。我没有找到任何合适的解决方案,因此在将其与 request.path
连接之前,我最终在 View 中对 URL 的常量部分进行了硬编码。
如果您使用的是部分渲染,最好使用
{{ request.path_info }}
它返回页面的确切 url
您可以使用 {{request.path}} 获取不带参数的 url 您可以使用 {{request.get_full_path}} 获取带参数的 url
这是一个老问题,但如果您使用 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>
就是这样,不需要做任何其他事情,注销后他们将立即重定向到他们所在的页面,登录时,他们将填写表格,然后重定向到他们所在的页面。即使他们错误地尝试登录它仍然有效。
{{ request.path|urlencode }}
以上答案是正确的,它们给出了很好的简短答案。
我还在寻找在 Django 模板中获取当前页面的 url,因为我的意图是在请求时激活 HOME page
、MEMBERS page
、CONTACT page
、ALL 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
?这将节省一大堆冗余代码:)
对于 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)
在 Django 3 中,您想使用 url 模板标签:
{% url 'name-of-your-user-profile-url' possible_context_variable_parameter %}
使用示例:
<!-- 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>
要将 get 参数传递给模板,您可以通过 views.py
文件传递它
例子:
return render(request, 'test.html',{'get_parameter_name' : get_parameter_value})
并在模板中使用,例如:
{{get_parameter_name}}
如果你也在模板中使用 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>
...
render_to_response
,而不是render_to_request
。而且您不能像在 settings.py 中那样定义TEMPLATE_CONTEXT_PROCESSORS
,而无需提及模板中可能使用的其他默认处理器!request.path
不包括像?foo=bar
这样的查询参数。请改用request.get_full_path
。urlencode
,通常:.../accounts/login?next={{ request.get_full_path | urlencode }}...