如何解决如何将当前查询字符串添加到Django模板中的URL?
| 加载页面时,有一个链接“ sameLink \”,我想在该链接后附加其包含页面的查询字符串。 我有以下网址:somedomain/reporting/article-by-month?variable1=2008
我怎样才能做到这一点?
解决方法
要捕获请求中的QUERY_PARAMS,请引用包含这些参数(
request.GET
)的字典并对其进行urlencode,以便将它们接受为href的一部分。 request.GET.urlencode
返回的字符串类似于ds=&date_published__year=2008
,您可以将其放入页面中的链接,如下所示:
<a href=\"sameLink/?{{ request.GET.urlencode }}\">
, 如果您像下面那样注册一个模板标签:
@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 %}\">
这将保留查询字符串中已经存在的所有内容,并仅更新您指定的键。
, 我发现当您想要更新现有查询参数时,@ Michael \的答案不太起作用。
以下为我工作:
@register.simple_tag
def query_transform(request,**kwargs):
updated = request.GET.copy()
for k,v in kwargs.iteritems():
updated[k] = v
return updated.urlencode()
, 接下来是@Prydie(谢谢!),我想做同样的事情,但是在Python 3和Django 1.10中,除了能够剥离查询字符串键并进行修改之外,我还想这样做。为此,我使用以下代码:
@register.simple_tag
def query_transform(request,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位在.iteritems()
上是kwargs.items()
, 收到其他答案的通知,但不需要传递ѭ11,仅更新现有参数。
@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 \'\'
, 基于@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测试
, 如果您不希望循环或字符串串联,则只是一种解决方法。
url的字符串表示形式类似于\'<WSGIRequest: GET \\\'our_url\\\'>\'
因此,如果要our_url
,则只需使用正则表达式即可。
our_url = re.search(r\'\\/.*(?=\\\'>)\',str(request)).group()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。