提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
URL别名和反向解析
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from app01 import views
'''给URL起别名,在URL后面加name参数'''
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^book/list/', views.book_list, name='book_list'),
url(r'^book/add/', views.book_add,name='book_add'),
url(r'^book/edit/(\d+)/', views.book_edit, name='book_edit'), # /book/edit/2/
url(r'^book/del/(?P<n>\d+)/', views.book_del,name='book_del'), # /book/edit/2/
]
视图函数部分
from django.urls import reverse
print(reverse('book_list')) #/book/list/
print(reverse('book_edit',args=(2,))) # /book/edit/1/ URL的无名分组参数
print(reverse('book_edit',kwargs={'n': 1,})) # /book/edit/1/ URL的有名分组参数
return redirect('book_list')
'''redirect重定向可以不用写reverse就可以反向解析,因为redirect方法里有reverse方法'''
return redirect(reverse('book_list'))
HTML部分
<!-- 无参数的 -->
<a class="btn btn-primary" href="{% url 'book_add' %}">添加书籍</a>
<!-- 无名分组参数的 -->
<a href="{% url 'book_edit' books.id 3 4 %}" class="btn btn-warning">编辑</a>
<!-- 有名分组 -->
<!-- 以下两种方法都可以 -->
<!-- 多个参数用空格分开 -->
<a href="{% url 'book_del' books.id %}" class="btn btn-danger">删除</a>
<a href="{% url 'book_del' n=books.id %}" class="btn btn-danger">删除</a>
路由分发和URL命名空间
项目主目录下的urls.py
'''当用户访问的路径为 /app01/index/那么会先找到总路由,总路由先匹配路径前缀,
匹配好之后,就找到对应的应用下面的urls.py文件中的路径来匹配剩余部分路径,然后执行对应的视图函数.'''
from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
'''URL分发使用include方法,
命名空间使用namespace属性,,是为了解决路径重名的问题,开辟独立的空间把应用所对应的url存到空间站,重名路径就不会相互干扰'''
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls',namespace='app01')),
url(r'^app02/', include('app02.urls',namespace='app02')),
]
app01/urls.py
复制代码
from app01 import views
urlpatterns = [
url(r'^index/', views.index, name='index'),
url(r'^book/list/', views.book_list, name='book_list'),
url(r'^book/add/', views.book_add, name='book_add'),
url(r'^book/edit/(\d+)/', views.book_edit, name='book_edit'),
url(r'^book/del/(?P<n>\d+)/', views.book_del, name='book_del'),
]
app01/views.py
def index(request):
'''app01:index命名空间在视图中的写法,由应用名(namespace='app01'):路径'''
print(reverse('app01:index'))
return HttpResponse('app01的路径:' + reverse('app01:index'))
app02/urls.py
from app02 import views
urlpatterns = [
url(r'^index/', views.index, name='index'),
]
app02/views.py
def index(requset):
print(reverse('app02:index'))
return HttpResponse('app02的路径: ' + reverse('app02:index'))