映射
视图写完后,要与URL进⾏映射,也即⽤户在浏览器中输⼊什么url的时候可以请求到这个视图函数。在⽤户输⼊了某个url,请求到我们的⽹站的时候,
django会从项⽬的urls.py⽂件中寻找对应的视图。在urls.py⽂件中有⼀个urlpatterns变量,以后django就会从这个变量中读取所有的匹配规则。匹配规则需要使⽤django.urls.path函数进⾏包裹,
这个函数会根据传⼊的参数返回URLPattern或者是URLResolver的对象。
from django.contrib import admin
from django.urls import path
from django.http import HttpResponse
def index(request):
return HttpResponse("hell Django")
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.boot),#普通路由需要写出绝对路径才能映射,视图
]
URL的模块化
在项⽬中,不可能只有⼀个app,如果把所有的app的views中的视图都
放在urls.py中进⾏映射,肯定会让代码显得⾮常乱。不方便我们进行查询,和排查可以在app内部包含⾃⼰的url匹配规则,⽽在项⽬的urls.py中再统⼀包含这个app的urls。使⽤这个技术需要借助include函数。
主路由文件中编写
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', include('book.urls')),#指定需要路由寻找映射的路径
]
bookAPP中编写
from django.urls import path
from . import views
from django.urls import converters
urlpatterns = [
path('<int:book_id>',views.book1),
path('book2/', views.book2),
]
当有多个App并且app中功能名称一样时就容易出现问题为应对此类问题可以把多个APP给各自隔离起来只会调用有关的项
url命名与反转
1.为什么需要URL命名
因为在项⽬开发的过程中URL地址可能经常变动,如果写死会经常去修改
2.如何给⼀个URL指定名称
path("",views.index,name="index")
3.应⽤命名空间
在多个app之间可能产⽣同名的URL,这时候为了避免这种情况,可以使⽤
命名空间来加以区分。在urls.py中添加app_name即可。
如果需要给app——url重新命名
urlpatterns = [
path('',views.index),
path('sgin/',views.login,name='login'),#name= 把所有login字段的访问这个app的记录全
#部映射名字随便改
并给URL指定一个名称
应用空间命名
主路由文件
from django.contrib import admin
from django.urls import path,include
import book
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', include('book.urls')),
path('cms/', include('cms.urls')),
path('front/',include('front.urls')),
path('cms1/', include('cms.urls',namespace='cms1')),
path('cms2/', include('cms.urls',namespace='cms2')),
path('news/', include('news.urls')),
]
app路由文件
from django.urls import path
from . import views
app_name = 'cms'
urlpatterns = [
path('',views.index),
path('sgin/',views.login,name='login'),
path('news/<news_id>',views.news,name='news'),
]
URL反转传递参数
如果这个url中需要传递参数,那么可以通过kwargs来传递参数。
主路由
from django.contrib import admin
from django.urls import path,include
import book
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', include('book.urls')),
path('cms/', include('cms.urls')),
path('front/',include('front.urls')),
path('cms1/', include('cms.urls',namespace='cms1')),#不同功能访问相同视图
path('cms2/', include('cms.urls',namespace='cms2')),
path('news/', include('news.urls')),
]
app路由cms
from django.urls import path
from . import views
app_name = 'cms'
urlpatterns = [
path('',views.index),
path('sgin/',views.login,name='login'),
path('news/<news_id>',views.news,name='news'),
]
视图
def index(request):
current_namespace = request.resolver_match.namespace
name = request.GET.get('name')
if name:
return HttpResponse("后台首页")
else:
# return redirect('cms:login')
return redirect(reverse('cms:news',kwargs={'news_id':1}))
return redirect(reverse('cms:login') + '?name=jzj')#给路由添加变量跳转
指定默认的参数
主路由
from django.contrib import admin
from django.urls import path,include
import book
urlpatterns = [
path('news/', include('news.urls')),
]
app路由
from django.urls import path
from . import views
from django.urls import converters
urlpatterns = [
path('',views.index),#没有参数
path('<page>', views.index),#有参数
]
视图
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
# Create your views here.
def index(request,page=1):#默认指定参数1
return HttpResponse('新闻第是%s篇' % page)