我如何放置一个HTML链接,它指向 * 当前 * 页面,和添加额外的GET参数(或覆盖现有参数,如果它们已经存在)?
现在我有这样的想法:
<a href="{{ request.path }}?Key=Value"> My Link </a>
当前,request
被传递到页面。如果request.path
为https://stackoverflow.com/,则生成的链接变为https://stackoverflow.com/?Key=Value
问题是什么?
当然,如果当前URL是https://stackoverflow.com/?PrevKey=PrevValue,则它变为:
https://stackoverflow.com/?PrevKey=PrevValue?Key=Value
注意第二个问号不正确--它实际上应该是:
https://stackoverflow.com/?PrevKey=PrevValue&Key=Value
此外,如果 * 已经 * 有一个同名的键,那么我当前的解决方案将忽略它,而不是覆盖它--这是错误的。
我该如何解决这两个问题?
5条答案
按热度按时间sf6xfgos1#
你需要一个自定义标签,djangosnippets上有几个标签-this one看起来很全面。
iyfjxgzm2#
对于任何人看到这个在未来:https://bitbucket.org/monwara/django-url-tools
bogh5gae3#
您可以使用:{{request. get_full_path}}以获取带有附加参数的当前路径。
njthzxwz4#
我只是一个Django的初学者,所以你必须对我的回答持保留态度。
首先,根据文档,
request.path
应该返回不带域的页面的路径,所以如果请求的是http://example.com/,request.path
应该只是"/"
,如果我错了请纠正我。更重要的是,
request.path
没有任何查询参数,所以如果请求的页面是http://example.com/?PrevKey=PrevValue,那么request.path
仍然是"/"
,如果想要获得查询参数,必须使用GET和POST属性的类似字典的访问(在本例中为GET),或者更好的方法是通过QueryDict方法访问它们。我在这里要做的(这绝不是最好的方法或代码)是准备一个自定义模板过滤器,在其中传递当前请求对象和要测试的键-值对。
这就是你的模板代码的样子。注意你仍然可以硬编码键值对,尽管这里它被格式化为一个带有“键冒号值”的字符串。过滤器函数可以处理(如果你需要)不止一组键值对。
过滤器功能:
我应该指出,如果请求是针对页面http://example.com/login/?prev=news,而您的模板看起来像
那么输出将是(希望如此,如果它起作用):
注意这个链接中没有域(例如http://example.com/部分),这是因为过滤器没有添加它,但是你可以修改它来添加。
我会留给你注册这个模板过滤器。更多在这里。希望这有帮助。
yrefmtwq5#
JavaScript解决方案非常适合这种情况。示例: