【问题标题】:How to get URL of current page, including parameters, in a template?如何在模板中获取当前页面的 URL,包括参数?
【发布时间】:2011-03-15 23:44:46
【问题描述】:

有没有办法在 Django 模板中获取当前页面 URL 及其所有参数?

例如,一个模板标签会打印一个完整的 URL,比如/foo/bar?param=1&baz=2

【问题讨论】:

标签: django django-templates django-urls django-request


【解决方案1】:

编写自定义上下文处理器。例如

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

见:

【讨论】:

  • 如果需要重定向,别忘了使用 urlencode 即{{request.get_full_path|urlencode}}
【解决方案2】:

使用 Django 的内置上下文处理器在模板上下文中获取请求。在设置中将request 处理器添加到TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (

    # Put your context processors here

    'django.core.context_processors.request',
)

在模板使用中:

{{ request.get_full_path }}

这样你就不需要自己编写任何新代码了。

【讨论】:

  • 应该注意,使用此方法会覆盖默认的 TEMPLATE_CONTEXT_PROCESSORS,因此您必须将它们添加回列表中。 The docs 有一个要包含在列表中的默认值列表。
  • 需要注意的是,在较新版本的 Django 中,此设置键已更改为 TEMPLATES['OPTIONS']['context_processors'],并且默认包含上述上下文处理器。
【解决方案3】:

在文件 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}}

【讨论】:

  • 抱歉,误投了反对票。请进行更改,以便我撤消。
【解决方案4】:

如果我们访问以下 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'

【讨论】:

    【解决方案5】:

    除了 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/ 将导致/)。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        您可以查看您的网址是否与其他网址不同。

        {% if 'foo/bar/' in request.get_full_path %}
        

        【讨论】:

          猜你喜欢
          • 2010-10-23
          • 1970-01-01
          • 2013-11-03
          • 2013-09-21
          • 2019-09-04
          • 2019-03-02
          • 2011-02-22
          相关资源
          最近更新 更多