有没有办法在Django模板中获取当前页面URL及其所有参数?
例如,可以打印完整网址的模板标签,例如/foo/bar?param=1&baz=2
答案 0 :(得分:67)
编写自定义上下文处理器。 e.g。
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 }}
。
请参阅:
答案 1 :(得分:22)
在上下文处理器中使用Django的构建来获取模板上下文中的请求。在设置中,将request
处理器添加到TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
# Put your context processors here
'django.core.context_processors.request',
)
在模板使用中:
{{ request.get_full_path }}
这样您就不需要自己编写任何新代码了。
答案 2 :(得分:7)
在文件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}}
答案 3 :(得分:1)
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 }}
答案 4 :(得分:1)
除了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/
将导致/
)。
答案 5 :(得分:1)
您可以查看您的网址是否与其他网址不同。
{% if 'foo/bar/' in request.get_full_path %}
答案 6 :(得分:1)
如果我们访问以下 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'