如何将当前查询string添加到Django模板中的URL?

当我加载一个页面,有一个链接“sameLink” ,我想追加到它的包含页面的查询string

我有以下url:

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

我怎样才能做到这一点?

为了捕获请求中包含的QUERY_PARAMS,你需要引用包含这些参数的字典( request.GET )并对它们进行urlencode编码,以便它们可以作为href的一部分被接受。 request.GET.urlencode返回一个string,看起来像ds=&date_published__year=2008 ,你可以放在页面上的链接,如下所示:

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

我发现@迈克尔的答案是不太工作,当你想更新现有的查询参数。

以下为我工作:

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

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

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

你可以修改你的模板中的查询string:

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

这将保留已经在查询string中的任何东西,只是更新您指定的键。

接下来从@Prydie(谢谢!)我想要做同样的事情,但在Python 3和Django 1.10中,除了可以去除查询string键以及修改它们。 为此,我使用这个:

 @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 bit是kwargs.items().iteritems()

通过其他答案通知,但不需要传入的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 ''