【发布时间】:2011-03-15 23:44:46
【问题描述】:
有没有办法在 Django 模板中获取当前页面 URL 及其所有参数?
例如,一个模板标签会打印一个完整的 URL,比如/foo/bar?param=1&baz=2
【问题讨论】:
标签: django django-templates django-urls django-request
有没有办法在 Django 模板中获取当前页面 URL 及其所有参数?
例如,一个模板标签会打印一个完整的 URL,比如/foo/bar?param=1&baz=2
【问题讨论】:
标签: django django-templates django-urls django-request
编写自定义上下文处理器。例如
def get_current_path(request):
return {
'current_path': request.get_full_path()
}
在 TEMPLATE_CONTEXT_PROCESSORS 设置变量中添加该函数的路径,并在模板中使用它,如下所示:
{{ current_path }}
如果您想在每个请求中包含完整的request 对象,您可以使用内置的django.core.context_processors.request 上下文处理器,然后在模板中使用{{ request.get_full_path }}。
见:
【讨论】:
{{request.get_full_path|urlencode}}
使用 Django 的内置上下文处理器在模板上下文中获取请求。在设置中将request 处理器添加到TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
# Put your context processors here
'django.core.context_processors.request',
)
在模板使用中:
{{ request.get_full_path }}
这样你就不需要自己编写任何新代码了。
【讨论】:
TEMPLATES['OPTIONS']['context_processors'],并且默认包含上述上下文处理器。
在文件 context_processors.py(或类似文件)中:
def myurl( request ):
return { 'myurlx': request.get_full_path() }
在settings.py中:
TEMPLATE_CONTEXT_PROCESSORS = (
...
wherever_it_is.context_processors.myurl,
...
在你的 template.html 中:
myurl={{myurlx}}
【讨论】:
如果我们访问以下 URL:http://127.0.0.1:8000/home/?q=test
然后
request.path = '/home/'
request.get_full_path() = '/home/?q=test'
request.build_absolute_uri() = 'http://127.0.0.1:8000/home/?q=test'
【讨论】:
除了 sdolan 的回答:
如果您使用 I18N 并希望将 next 值传递给 /i18n/setlang/ 以更改当前页面的语言,那么您也需要从完整路径中删除当前语言代码。比如:
full_path = request.get_full_path()
current_path = full_path[full_path.index('/', 1):]
这假设每个路径都具有/LANG_CODE/any/other/stuff/with/?param='yay' 格式,并且无论它是什么都简单地启动LANG_CODE(例如,/en/ 将导致/)。
【讨论】:
Django有很多内置的东西,但是如果你不明确你想用什么,它就不会被使用。
因此,在 MTV 模式(模型、模板、视图)中,视图接收请求并使用模板渲染生成响应,向其传递该视图的字典或所有局部变量(使用 locals() 函数) .知道了这一点,我们可以插入来自响应的当前 url,如下所示:
views.py:
from django.shortcuts import render
def page(request):
currentUrl = request.get_full_path()
return render(request, 'app/page.html', locals())
然后,在模板 'app/page.html' 中,您只需执行以下操作即可显示我们刚刚创建并通过 locals() 传递的 currentUrl 变量:
应用程序/模板/page.html:
{{ currentUrl }}
【讨论】:
您可以查看您的网址是否与其他网址不同。
{% if 'foo/bar/' in request.get_full_path %}
【讨论】: