【问题标题】:Django: preserving GET parameters in URL template tagDjango:在 URL 模板标签中保留 GET 参数
【发布时间】: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 postthis gist 通过创建一个新的模板标签并使用它而不是 Django 的 url 模板标签来解决这个问题。

这真的是最好的解决方案吗?我最终不得不用我自己的标签替换整个应用程序中{% url %} 的每个实例。它也不会修复 reverse() 的使用。

【问题讨论】:

    标签: python django


    【解决方案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 中。还是谢谢!
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2020-05-02
    • 2010-12-19
    • 2011-05-03
    • 2013-05-04
    • 1970-01-01
    • 2014-10-10
    • 2010-09-20
    相关资源
    最近更新 更多