Django-路由(反向解析,名称空间)
反向解析
#没有正则表达式的url from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), #定义一个路由,并且给路由起名为login path('login/',views.login,name='login') ] #在模板中使用,这样就可以反向解析出login的url,跟换url都不在需要重新写模板 <form method="post" action="{% url 'login'%}"> <input type="text" name="name"> <input type="password" name="pwd"> <input type="submit"> </form>
#有正则表达是的url from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), #定义一个url,并起名为login re_path(r'^login/([0-9]{4})/$',views.login,name='login') ] #定义一个login 函数 from django.shortcuts import render,HttpResponse #在python代码中反向解析url 需要导入reverse from django.urls import reverse def login(request): #在url中含有正则表达式时,我们需要自行传入参数,并且传入的参数必须符合正则表达式,元组形式,后面必须加逗号 url =reverse('login',args=(2008,)) print(url) if request.method =='GET': return render(request,'login.html',{'url':url}) else: name =request.POST.get('name') pwd =request.POST.get('pwd') if name =='xxx' and pwd=='123': return HttpResponse('400') else: return HttpResponse('404')
名称空间的问题
#url的名称空间 #我们建立了app01 app02 两个应用 # ------------------------app01路由-------------------- from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), #给index取名为 i path('index/',views.index,name='i'), ] # ------------------------app01视图-------------------- from django.shortcuts import render,HttpResponse from django.urls import path,reverse def index(request): return HttpResponse(reverse('i'))
# ------------------------app02路由-------------------- from django.urls import path,include from app02 import views urlpatterns = [ #app02 index同样起名i path('index/',views.index,name='i') ] # ------------------------app02视图-------------------- from django.shortcuts import render,HttpResponse from django.urls import path,reverse # Create your views here. def index(request): return HttpResponse(reverse('i')) # ------------------------全局url-------------------- from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('app01/',include('app01.urls')), path('app02/',include('app02.urls')) ]
我们分别访问 http://127.0.0.1:8000/app01/index/ 发现获取的反向地址都是相同的。
修改:
#首先修改全局,建立空间名称 from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), #建立app01,app02两个名称空间 path('app01/',include(('app01.urls','app01'))), path('app02/',include(('app02.urls','app02'))) ] #之后在app01中应用 from django.shortcuts import render,HttpResponse from django.urls import path,reverse def index(request): return HttpResponse(reverse('app01:i')) #在app02中应用 from django.shortcuts import render,HttpResponse from django.urls import path,reverse def index(request): return HttpResponse(reverse('app02:i'))
这样修改之后,就可以正常解析出正确的地址