1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如:
url(r'^users/', include('users.urls', namespace='users')),
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
2) 在定义普通路由时,可以使用name参数指明路由的名字,如:
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
使用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(命名空间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')