Django:在URL模板标签中保留GET参数



我在Django应用程序中使用GET参数来传递信息,我希望使用Django的{% url %}模板标记在未来的链接中保留这些信息。

在我的情况下,这是为了允许在应用程序中只访问视图。

示例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

解决方案

这篇博客文章和这个要点通过创建一个新的模板标签并使用它来代替Django的url模板标签来解决这个问题。

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

Django中间件可以满足您的需求。您可以检查何时收到密钥参数并存储在会话中,然后如果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%工作,但我希望你明白这个想法。

最新更新