介绍
django自带反向解析生成URL的功能,目的是避免硬编码,较少代码维护的代价。
前端页面使用模板语法,如:{% url "rbac: request menu_list" %}
后台视图函数使用django组件函数:reverse()
但是,当需要在页面跳转时携带浏览器搜索框中的GET请求的参数时(如,'?page=1'),上述方法就难以满足需求,需要自定制反向生成路由的方法。
这里可以考虑使用django的simple_tag
并利用组件QueryDict
前端页面反向生成url
前端页面扩展原模板语法的反向解析功能
- 利用simple_tag前端页面对反向解析url做出来
- 使用QueryDict打包当前URL中的参数,会自动转译
@register.filter
def memory_url(request, name, *args, **kwargs):
"""
生成带有原搜索条件的url
:param request:
:param name: 带namespace的url别名
:return:
"""
original_url = reverse(name, args=args, kwargs=kwargs)
# 当前url中无搜索条件
if not request.GET:
return original_url
query_dict = QueryDict(mutable=True)
query_dict["_filter"] = request.GET.urlencode()
return "%s?%s" % (original_url, query_dict.urlencode())
<a href="{% memory_url request "rbac:menu_add" %}">新建</a>
后台视图函数反向生成url
后台视图中扩展Django自带的reverse()反向解析功能
def memory_reverse(request, name, *args, **kwargs):
"""
反向生成带有原搜索条件的url
:param request:
:param name: 带有namespace的url别名, 如:"rbac:menu_list"
:param args:
:param kwargs:
:return:
"""
url = reverse(name, args=args, kwargs=kwargs)
origin_params = request.GET.get("_filter")
if origin_params:
url = "%s?%s" % (url, origin_params)
return url
def menu_add(request):
...
form = MenuModelForm(data=request.POST)
if form.is_valid():
form.save()
return redirect(memory_reverse(request, "rbac:menu_list"))
return render(request, "rbac/change.html", {"form": form})