关于django中的path函数和include函数
path
: 这是Django的URL路由系统中的一个函数,用于将一个URL模式映射到一个视图函数或类。
path(route, view, kwargs=None, name=None)
route
: 一个字符串,表示 URL 的模式或者路径。例如''
代表根路径,'articles/'
代表路径前缀为articles/
的 URL。view
: 当 URL 被访问时调用的视图函数或基于类的视图。kwargs
: 一个可选的字典,包含要传递给视图函数的额外关键字参数。name
: 一个可选的字符串,用于给这个 URL 路由命名,这样在模板和视图中可以通过这个名字反向解析 URL。
1-关于路径:
path("", views.index, name="index")
这里的路径是一个空字符串,代表这跟路径(“跟路径”通常指的是文件或目录结构的起始点。在Unix和Linux系统中,根路径通常表示为“/”,而在Windows系统中,根路径可能是“C:\”或其他驱动器字母)
解释一下上述代码:
当用户访问一个IP地址或者网站的时候,一般第一页显示的是根URL,根路径对应的URL就是根URL啦,当用户访问这个的时候,django就会调用views.py中的index这个函数,
path('admin/', admin.site.urls),
这行代码是URL配置的一部分,用于将admin/
路径映射到Django自带的后台管理界面的URL模式。admin.site.urls
: 这是一个URL配置对象,通常由Django的admin应用提供。这个对象包含了Django后台管理界面所需要的所有URL模式
2-name:
urlpatterns = [
path('', views.index, name='index'),
name='index'给这个URL模式命名为了index。这意味着你可以在Django的模板中使用{% url 'index' %}来生成这个URL,或者在视图中使用reverse('index')来获取这个URL
如果你不为URL模式指定name参数,那么在Django模板中你将无法使用{% url %}标签来动态生成该URL。同样地,在视图中你也无法使用reverse()函数来获取该URL。
如果你没有为根URL的视图指定名称,并且想要在模板中引用它,你将需要硬编码URL的路径
3-include函数:
path("", include("library_project.urls"))
同样这也是一个根目录,含有如下:
path('', include('myapp.urls'))意味着当访问应用的根URL时(例如,http://example.com/),Django将查找myapp.urls中定义的URL模式。这通常用于将应用的URL模式直接映射到项目的根URL。
而path('myapp/', include('myapp.urls'))意味着当访问http://example.com/myapp/时,Django才会查找myapp.urls中定义的URL模式。这允许您将应用的URL空间限制在一个特定的路径前缀下
4-path
函数的基本用法,包括如何映射URL路径到视图函数,以及如何处理带参数的URL
path("list_employee_old", list_employee_old)
这行代码定义了一个URL路由,它将list_employee_old
这个路径映射到list_employee_old
这个视图函数。当用户访问http://yourdomain.com/list_employee_old
这个URL时,Django会调用list_employee_old
这个视图函数来处理请求。
注意:这里没有使用name
参数来给这个URL路由命名,所以在模板中或视图中不能直接通过名字来反向解析这个URL。如果需要反向解析,你需要添加name
参数。
path("del_employee_new/<int:group>", del_dep_old)
这行代码定义了一个带参数的URL路由。它包含两部分:
del_employee_new/<int:group>
:这部分是URL的路径。<int:group>
是一个转换器,它告诉Django这个部分应该匹配一个整数,并将这个整数作为关键字参数group
传递给视图函数。del_dep_old
:这是当URL被匹配时要调用的视图函数。
当用户访问类似于http://yourdomain.com/del_employee_new/123
的URL时(其中123
是一个整数),Django会调用del_dep_old
这个视图函数,并将整数123
作为group
参数传递给这个函数。
注意(django中的路径是指网页地址去掉域名或ip地址,端口号以及残数剩下的部分)
http://
是协议部分。example.com
是域名。:8000
是端口号。/myapp/myview/
是URL路径。?param=value
是查询字符串。
在Django中,我们主要关心的是URL路径部分,即/myapp/myview/
。
http://example.com:8000/myapp/myview/?param=value
5-关于Django的URL模式像套娃一样嵌套
在Django中,一级URL和二级URL其实是指URL配置的不同层次。
一级URL,通常指的是在项目的urls.py文件中直接配置的URL模式。这些URL模式直接关联到视图函数或基于类的视图,用于处理用户请求。例如,你可能会在项目的urls.py中看到类似这样的配置:path('home/', HomeView.as_view(), name='home'),这就是一个一级URL,它直接指向了名为HomeView的视图。
而二级URL,则是在Django的app中定义的URL模式。这些URL模式首先会在app的urls.py文件中定义,然后通过include函数在项目的urls.py文件中引入。这样的结构使得URL配置更加模块化,便于管理和维护。例如,你可能有一个app叫做blog,它有自己的urls.py文件,里面定义了博客相关的URL模式,然后在项目的urls.py文件中通过include('blog.urls')引入这些URL模式。
在Django中,一级URL和二级URL的区分主要是基于URL配置的结构和层次。一级URL更偏向于全局和整体的配置,而二级URL则更侧重于特定应用和功能的配置。这样的设计使得Django的URL配置既灵活又易于管理。
如:
当访问test_orm_old/时django会到employee目录下查找urls,
urls.内容如下
from django.urls import path, include
from employee.views import *
urlpatterns = [
path("list_employee_old/",list_employee_old),
path("add_employee_old/", add_employee_old),
path("edit_employee_old/<int:emp_id>/", edit_employee_old),
path("del_employee_old/<int:emp_id",del_employee_old),
]当我访问list_employee_old/时,django又会在views中查找list_employee_old函数,include()函数可以接受一个模块路径作为参数,该模块应该包含一个名为urlpatterns的列表,其中包含该模块定义的URL模式。如果path()里面没有include,默认是视图函数。如果views中是
def list_employee_old(request): dep_list = models.Department.objects.all() return render(request, 'test_orm_old/list_dep_old.html', {'dep_list': dep_list})
django又会在'test_orm_old目录下查找list_dep_old.html'