我在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()
的使用。
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%工作,但我希望你明白这个想法。