反向解析
一、概念
随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超链接忘记修改,有办法让链接根据正则表达式动态生成吗? 就是用反向解析来解决
二、主要作用
- 配合模板语法url使用
- 在python代码中配合重定向使用
三、使用
1、前期准备工作
- 在urls.py中
url(r’路径’,视图函数或者视图类,name='别名'),
url(r’根路径’,include(‘二级路由路径’, namespace=’命名空间’)), # 二级路径 url(r’二级路径’, 视图函数或者视图类, name='别名'),
- 说明
- name
反向解析的名称 - namespace
非必要,当我们的二级路由中name有相同的时候,需要用到该参数
- name
2、模板中超链接使用
- 语法格式
# 直接使用别名 {% url "url_name" arg1 arg2 %}
# 使用命名空间+别名 {% url '[命名空间]:别名' }
# 动态路由带参数 {% url '[命名空间]:别名' 参数 参数}
- 示例代码-基础使用
- 在urls.py中
url(r'base/', views.reverse_base, name='base'),
- 视图函数中
def reverse_base(request): return render(request, 'base.html')
- 在templates中
<a href="/base/">普通链接写法</a> <a href="{% url 'base' %}">反向解析基础使用</a>
- 在urls.py中
- 示例代码-命名空间
- url.py中
# 根路由 url('reverse/', include('reverse_ex.urls', namespace='reverse')), # 二级路由 url(r'space/', views.reverse_ns, name='space'),
- 视图函数
def reverse_ns(request): return render(request, 'reverse_ns.html')
- 在模板中使用
# 直接使用路径 <a href="/reverse//base/">命名空间普通链接</a> # 使用反向解析 <a href="{% url 'reverse:space' %}">反向解析使用命名空间</a>
- 示例代码-带参数
- url
# 根路由 url('reverse/', include('reverse_ex.urls', namespace='reverse')), #二级理由 url(r'params/(\d+)/(\d+)/', views.reverse_index, name='params'),
- 视图函数
def reverse_params(request, page, size): return render(request, 'reverse_params.html')
- 在模板中
# 直接使用路径 <a href="/reverse/params/1/10/">反向解析带参数普通链接</a><br> # 使用反向解析 <a href="{% url 'reverse:params' 1 10 %}">反向解析带参数</a><br>
- url
3、在视图函数中配合reverse使用
- 语法格式
reverse(viewname, args=None, kwargs=None)
- 参数说明
- viewname
视图函数的名字或者索引名 - args
动态路径的参数 - kwargs
动态路径的关键字参数,不要和args同时使用
- viewname
- 示例代码
- urls.py中
url('index/', views.reverse_index,name='index'),
- 视图函数
def redirect_reverse(request): # 通过路由中的别名(索引名) base = reverse('index') # /index/ # 通过视图函数名 path_base = reverse(views.pg_list) # # 普通动态路由 反向解析 patt_params = reverse('reverse:params', args=[1, 10]) # 关键字动态路由反向解析 path_kw = reverse('reverse:kw', kwargs={'id': 1}) return redirect(base)
- urls.py中