1. 流程
- Django的项目文件夹和每个应用(app)目录下都有urls.py文件,它们构成了Django的路由配置系统。服务器收到用户请求后,会根据用户请求的url地址和urls.py里配置的url-视图映射关系,去调用执行相应的视图函数或视图类,最后由视图返回数据给客户端
2. path和re_path方法
-
path方法:采用双尖括号<变量类型:变量名>或<变量名>传递,例如int:id, slug:slug或。
-
re_path方法: 采用命名组(?P<变量名>正则表达式)的方式传递参数。
3. 示例
在使用path和re_path方法设计urls需注意:
- url中的参数名要用尖括号,而不是圆括号
- path匹配模式的最开头不需要添加斜杠 /,但建议以斜杠结尾
- re_path模式不一定总是以 $ 结尾,有时不能加。比如下例中把blog.urls通过re_path加入到项目urls中时就不能以$结尾,因为这里的blog/并不是完整的url,只是一个开头而已
# 示例1,PATH
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
# 示例2:RE_PATH,与上例等同
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
# 示例3
urlpatterns = [
re_path(r'^blog/', include('blog.urls')),
...
]
# 示例4
from django.urls import path, re_path
from . import views
# app_name = 'blog' # 命名空间,后面会用到。
urlpatterns = [
path('blog/articles/', views.article_list, name = 'article_list'),
path('blog/articles/create/', views.article_create, name = 'article_create'),
path('blog/articles/<int:id>/', views.article_detail, name = 'article_detail'),
path('blog/articles/<int:id>/update/', views.article_update, name = 'article_update'),
path('blog/articles/<int:id>/delete/', views.article_update, name = 'article_delete'),
]
# 示例5:字典传参,as_view()
# 1. 通过字典的形式传递额外的参数给视图, 而不用把这个参数写在链接里
# 2. url指向类视图必须使用 as_view() 方法
urlpatterns = [
path('', views.ArticleList.as_view(), name='article_list', {'blog_id': 3}),
]
4. URL命名好处
-
给每个URL取了个全局变量的名字,可以在Django的任意处(包括模板和视图函数中),特别方便地显式引用它
-
模板中使用:
{% for article in articles %}
<a href="{% url 'blog:article_detail' article.id %}">{{ article.title }}</a>
# 通过url名字调用,方便并且动态生成链接
<a href="blog/articles/{{ article.id }}">{{ article.title }}</a>
# 硬编码url,不建议,万一全部要改动,工作量大
{% endfor %}
- 视图中使用(借助 reverse 方法):
# 命名的URL一般只在模板里使用,不能直接在视图里使用
# reverse()方法在视图中可以对命名urls进行反向解析,生成动态链接
from django.urls import reverse
reverse('blog:article_detail', args=[id])
# 输出 :blog/articles/id