Django:在 URL 模板标签中保留 GET 参数
Posted
技术标签:
【中文标题】Django:在 URL 模板标签中保留 GET 参数【英文标题】:Django: preserving GET parameters in URL template tag 【发布时间】:2021-03-25 16:21:48 【问题描述】:我在我的 Django 应用程序中使用 GET 参数来传递信息,我希望在以后使用 Django 的 % url %
模板标签的链接中保留这些信息。
在我的情况下,这是为了允许在应用程序内进行仅查看访问。
示例网址:
https://my.app/entry/123?key=abcdef
该页面上的示例链接已创建如下:
<a href="% url 'entry_detail' entry.id %">View more details</a>
期望的结果:
我希望 Django 的 URL 模板标签在整个应用程序中自动保留任何名为 key
的 GET 参数。在这种情况下,它将生成应用相同参数的新 URL。例如:
https://my.app/entry/123/details?key=abcdef
解决方法
This blog post 和 this gist 通过创建一个新的模板标签并使用它而不是 Django 的 url
模板标签来解决这个问题。
这真的是最好的解决方案吗?我最终不得不用我自己的标签替换整个应用程序中% url %
的每个实例。它也不会修复 reverse()
的使用。
【问题讨论】:
【参考方案1】:Django 中间件可以满足您的需求。您可以检查何时收到关键参数并存储在session,然后如果url中没有关键参数,则附加它:
class DetectKeyParameter:
def __init__(self, get_response):
self.get_response = get_response
@staticmethod
def process_view(request, view_func, view_args, view_kwargs):
return view_func(request, *view_args, **view_kwargs)
def __call__(self, request):
if 'key' in request.GET:
#If alerady is on the url just store it on session
request.session['key'] = request.GET.get('key')
else:
if 'key' in request.session:
if not request.GET._mutable:
#You need to change this property to add parameters to GET
request.GET._mutable = True
# now you can edit it
request.GET['key'] = request.session['key']
request.GET._mutable = False
response = self.get_response(request)
return response
这样,您将在每个请求中都有 key 参数,直到您删除会话变量。也许代码不能 100% 工作,但我希望你能明白。
【讨论】:
谢谢,这实际上并没有重写页面上的链接,但我感谢您通过将key
移动到会话变量来解决这个问题。这种方法的缺点是这些页面无法共享或添加书签。
你说得对!也许,您可以尝试重定向直接将参数添加到url return redirect(request.url+'?key='request.GET.get('key'))
,而不是在请求中添加密钥。
这最终创建了一个重定向循环。它也感觉有点笨拙,因为它不尊重现有的 GET 参数。我使用的最后一个框架自动处理了所有这些,所以我有点惊讶它没有包含在 Django 中。还是谢谢!以上是关于Django:在 URL 模板标签中保留 GET 参数的主要内容,如果未能解决你的问题,请参考以下文章