如何将当前查询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 ''