📅  最后修改于: 2023-12-03 14:40:46.634000             🧑  作者: Mango
在Django中,URL模式是将网址映射到视图的方法。当用户在浏览器输入URL时,Django将会根据URL模式来确定要调用哪个视图函数。
在Django中,URL模式是使用正则表达式(regular expression,re)来表达的。一个URL模式通常包括以下几个部分:
比如下面这个URL模式:
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello, name='hello'),
]
这个URL模式的意思是,当用户访问网站的/hello/路径时,Django将会调用views.hello函数来处理这个请求。这个URL模式还有一个名字叫做hello,这样我们在代码中可以用urlresolvers.reverse('hello')来获取/hello/的URL。
视图函数通常会返回一个HttpResponse对象,这个对象会被Django返回给用户的浏览器。
一个常见的需求是,需要在URL中传递参数,然后在视图函数中处理这些参数。比如一个博客网站,需要根据用户请求的URL来获取不同的文章。这时就可以使用Django的URL模式参数化的功能。
下面是一个这样的例子:
from django.urls import path, re_path
from . import views
urlpatterns = [
re_path(r'^articles/(\d{4})/$', views.year_archive),
re_path(r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
re_path(r'^articles/(\d{4})/(\d{2})/(\d+)/$', views.article_detail),
]
这个例子中,我们定义了三个URL模式,分别对应不同的文章归档页面和文章详情页。URL模式中的(\d+)用于匹配一个或多个数字,这个数字将会作为参数传递给对应的视图函数。
在视图函数中,我们可以通过函数参数来获取这些参数。比如:
def article_detail(request, year, month, pk):
# ...
这个视图函数接受三个参数:year、month和pk,分别对应URL模式中的(\d{4})、(\d{2})和(\d+)。
在复杂的应用中,可能会出现不同的应用包含相同的URL模式。为了避免冲突,可以为不同的应用指定不同的命名空间。这个功能在Django 2.0中新增了。
在URL模式中指定命名空间可以通过namespace参数来实现。比如:
from django.urls import path, include
app_name = 'blog' # 定义命名空间
urlpatterns = [
path('', include('blog.urls', namespace='blog')), # 嵌套应用的URL
]
这个例子中,我们定义了一个命名空间为blog(注意这个名称和views.py中的app_name是一致的),然后使用include将子应用的URL模式嵌套进来,并通过namespace参数指定了命名空间。这样在子应用中就可以通过urlresolvers.reverse('blog:article_detail')来获取URL了。
Django的URL模式是将网址映射到视图的方法。使用正则表达式(re)可以实现参数化的URL。在复杂应用中,可以使用命名空间来避免不同应用之间的URL冲突。