【问题标题】:How to add the current query string to an URL in a Django template?如何将当前查询字符串添加到 Django 模板中的 URL?
【发布时间】:2011-09-21 04:07:13
【问题描述】:

当我加载一个页面时,有一个链接 "sameLink" 我想将其包含的 查询字符串 附加到它页面。

我有以下网址:

somedomain/reporting/article-by-month?variable1=2008

我该怎么做?

【问题讨论】:

标签: python django


【解决方案1】:

要捕获作为请求一部分的 QUERY_PARAMS,请引用包含这些参数 (request.GET) 的 dict 并对它们进行 urlencode,以便它们可以作为 href 的一部分。 request.GET.urlencode 返回一个类似于 ds=&date_published__year=2008 的字符串,您可以将其放入页面上的链接中,如下所示:

<a href="sameLink/?{{ request.GET.urlencode }}">

【讨论】:

  • 对于那些刚刚开始的人,请确保在您的设置中启用了 django.core.context_processors.request 上下文处理器。
  • 在以后的 django 版本中是django.template.context_processors.request,但无论如何上面对我不起作用,返回空字符串
  • @stelios 我刚刚遇到了同样的问题并修复了它。您只需将request 对象传递给您的模板
  • 我认为目的是使用urlencode(管道不是点)&lt;a href="sameLink/?{{ request.GET.variable1|urlencode }}"&gt;
【解决方案2】:

如果你注册一个模板标签如下:

@register.simple_tag
def query_transform(request, **kwargs):
    updated = request.GET.copy()
    updated.update(kwargs)
    return updated.urlencode()

您可以在模板中修改查询字符串:

<a href="{% url 'view_name' %}?{% query_transform request a=5 b=6 %}">

这将保留查询字符串中已经存在的所有内容,并仅更新您指定的键。

【讨论】:

  • 这和@Prydie 的回答值得更多关注。我有一个过滤、排序和分页的用例,如果没有这个想法,我会被搞砸的。我认为这个用例确实很常见。
  • 注意update() 在这种情况下“...附加到当前字典项目而不是替换它们。”。见QueryDict docs
【解决方案3】:

当您想更新现有查询参数时,我发现@Michael 的回答不太奏效。

以下内容对我有用:

@register.simple_tag
def query_transform(request, **kwargs):
    updated = request.GET.copy()
    for k, v in kwargs.items():
        updated[k] = v

    return updated.urlencode()

【讨论】:

【解决方案4】:

从@Prydie 开始(谢谢!)我想做同样的事情,但是在 Python 3 和 Django 1.10 中,除了能够剥离查询字符串键以及修改它们之外。为此,我使用这个:

@register.simple_tag
def query_transform(request, **kwargs):
    updated = request.GET.copy()
    for k, v in kwargs.items():
        if v is not None:
            updated[k] = v
        else:
            updated.pop(k, 0)  # Remove or return 0 - aka, delete safely this key

    return updated.urlencode()

python 3 位是 kwargs.items() 超过 .iteritems()

【讨论】:

    【解决方案5】:

    获知其他答案,但不需要传入request,仅更新现有参数。

    @register.simple_tag(takes_context=True)
    def querystring(context, **kwargs):
        """
        Creates a URL (containing only the querystring [including "?"]) derived
        from the current URL's querystring, by updating it with the provided
        keyword arguments.
    
        Example (imagine URL is ``/abc/?gender=male&name=Tim``)::
    
            {% querystring "name"="Diego" "age"=20 %}
            ?name=Diego&gender=male&age=20
        """
        request = context['request']
        updated = request.GET.copy()
        for k, v in kwargs.items():  # have to iterate over and not use .update as it's a QueryDict not a dict
            updated[k] = v
    
        return '?{}'.format(updated.urlencode()) if updated else ''
    

    【讨论】:

      【解决方案6】:

      基于@Prydie 的解决方案(它本身使用@Michael 的),我构造了标签以返回完整的URL 而不仅仅是参数字符串。

      我的myproject/template_tags.py

      from django import template
      
      
      register = template.Library()
      
      
      # https://stackoverflow.com/a/24658162/2689986
      @register.simple_tag
      def add_query_params(request, **kwargs):
          """
          Takes a request and generates URL with given kwargs as query parameters
          e.g.
          1. {% add_query_params request key=value %} with request.path=='/ask/'
              => '/ask/?key=value'
          2. {% add_query_params request page=2 %} with request.path=='/ask/?key=value'
              => '/ask/?key=value&page=2'
          3. {% add_query_params request page=5 %} with request.path=='/ask/?page=2'
              => '/ask/?page=5'
          """
          updated = request.GET.copy()
          for k, v in kwargs.items():
              updated[k] = v
      
          return request.build_absolute_uri('?'+updated.urlencode())
      

      我的settings.py

      TEMPLATES = [
          {
              ...
              'OPTIONS': {
                  ...
                  # loads custom template tags
                  'libraries': {
                      'mytags': 'config.template_tags',
                  }
              },
          },
      ]
      
      模板中的

      示例用法:

      {% load mytags %}
      <a href="{% add_query_params request page=2 %}">
      

      在 Django1.11.10 中使用 Python3.6 测试

      【讨论】:

        【解决方案7】:

        如果您不想要循环或字符串连接,这只是一种解决方法。

        url 的字符串表示形式类似于'&lt;WSGIRequest: GET \'our_url\'&gt;' 所以如果你想要our_url,你只需要使用正则表达式。

        our_url = re.search(r'\/.*(?=\'>)', str(request)).group()
        

        【讨论】:

          猜你喜欢
          • 2019-08-03
          • 1970-01-01
          • 2013-07-20
          • 2016-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 1970-01-01
          相关资源
          最近更新 更多