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 参数的主要内容,如果未能解决你的问题,请参考以下文章

django'url'模板标签错误

在 django 模板 URL 标签中传递参数

django url 模板标签的问题,% url %

在 Django url 模板标签中获取 javascript 变量的值

如何替换重新“。”在 Django 模板 url 标签中

Django:URL conf、url 模板标签的最佳实践