Django中路由命名与reverse反解析(逆向)

1.1 路由命名:在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如:

url(r'^users/', include('users.urls', namespace='users')),

命名空间表示,凡是users.urls中定义的路由,均属于namespace指明的users名下。

命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

2) 在定义普通路由时,可以使用name参数指明路由的名字,如:

urlpatterns = [
    url(r'^index/$', views.index, name='index'),
    url(r'^say', views.say, name='say'),
]

1.2 reverse反解析

使用reverse函数,可以根据路由名称,返回具体的路径,如:

from django.urls import reverse  # 注意导包路径

def index(request):
    return HttpResponse("hello the world!")

def say(request):
    url = reverse('users:index')  # 返回 /users/index/
    print(url)
    return HttpResponse('say')
  • 对于未指明namespace的,reverse(路由name)

  • 对于指明namespace的,reverse(命名空间namespace:路由name)

  • 注意:当reverse里面有参数时,reverse里面也要传入参数:

    不加参数会报错:

url(r'^weather/(?P<city>\w+)/(?P<year>\d{4})/$',views.weather,name='weather'),

def weather(request,city,year):
    print('city=%s' % city)
    print('year=%s' % year)
    url_weather = reverse('user:weather')
    print(url_weather)
    return HttpResponse('OK')

报错信息为:意思是Reverse里面找不到参数,而我们的访问路径里面有参数,可以进到reverse里面查看源码,可以给reverse添加参数。

Reverse for 'weather' with no arguments not found. 1 pattern(s) tried: ['user/weather/(?P<city>\\w+)/(?P<year>\\d{4})/$']

正确代码为:

url(r'^weather/(?P<city>\w+)/(?P<year>\d{4})/$',views.weather,name='weather'),

def weather(request,city,year):
    print('city=%s' % city)
    print('year=%s' % year)
    url_weather = reverse('user:weather',args=(city,year))
    print(url_weather)
    return HttpResponse('OK')

猜你喜欢

转载自blog.csdn.net/longting_/article/details/80918661