django 第二课 url路由及模板渲染方式
1.django的路由系统
- 路由解析原理:
当一个请求来到时:
1.首先到项目目录下的urls.py (根URLconf模块)中,查找路由规则
2.根URLconf模块,里面定义了 urlpatterns 变量
3.urlpatterns 是一个(django.urls.path,django.urls.re_path 对象)列表
4.按顺序运行每个url模式,在第一个匹配的模式停止
5.一旦匹配,django导入并调用给定的视图
6.如果中间出错,或者没有匹配到,返回404 - path(route, view, kwargs=None, name=None)
- route 是一个字符串的url规则
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
]
- view 是个视图
views试图里面的代码
from django.http import HttpResponse
def index(request):
return HttpResponse('hello,这是我的第一个django!')
可以通过http://127.0.0.1:8000/index/
'hello,这是我的第一个django!'
- kwargs 额外参数,传递给view,必须是一个字典
-
- name url的命名
- 在url中捕获参数
在url规则中使用<变量名>
可以捕获url中的值
传递给视图
** 捕获的值是 字符串
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
path('detail/<pk>/',views.detail)
]
可通过访问 http://127.0.0.1:8000/detail/2/
结果为
学生id为2
两个参数的时候可以这样写
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
path('detail/<pk>/<slug>/',views.detail)
]
也可以这样写
-
路径转换器
案例:<int:pk> 常用的装换器: - str 匹配除了‘/'路径分隔符之外的所有字符串 - int 匹配任意整数 - slug 匹配任意ascii字符 加上连字符和下划线 - uuid 格式化id - path 匹配任意非空字符
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
path('detail/<int:pk>/<slug>/',views.detail)
]
- re_path方法 (route, view, kwargs=None, name=None)
(route, view, kwargs=None, name=None)urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
path('detail/<int:pk>/<slug>/',views.detail),
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9] |1[0-2])/',views.students),
]
-
django 搜索 url 搜索的是什么?
只搜索路径部分,跟参数,以及请求方法(get,post)无关 同一个url 可以匹配 get, post -
包含其他URLconfs
include 包含
根url.py设置
urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',include('teacher.urls')) ]
app的teacher下url.py设置
from django.urls import path,re_path from . import views urlpatterns = [ path('index/',views.index), path('detail/<int:pk>/<slug>/',views.detail), re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9] |1[0-2])/',views.students), ]
teacher.py 里面的views设置
from django.shortcuts import render # Create your views here. from django.http import HttpResponse def index(request): return HttpResponse('hello,这是我的第一个django!') def detail(request,pk,slug): return HttpResponse('学生id为%s的详情页'%pk) def students(request,year,month): return HttpResponse('%s年%s月报名的学生列表'%(year,month))
这时候访问之前的链接需要添加teacher
-
kwargs 额外参数
path, re_path方法中,传递一个kwargs的额外参数
urls.py里面设置一个字典参数 kwargs={'status':True}
urlpatterns = [ path('admin/', admin.site.urls), path('index/',views.index), path('detail/<int:pk>/<slug>/',views.detail,kwargs={'status':True}), re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9] |1[0-2])/',views.students), ]
views 里面需要接收urls.py传递过来的kwargs
def detail(request,pk,slug,status): if status == True: return HttpResponse('学生id为%s的详情页'%pk) else: return HttpResponse('没有参数status')
***** 当kwargs 中的key与url中key一致的时候,以kwargs为准
urlpatterns = [ path('admin/', admin.site.urls), path('index/',views.index), path('detail/<int:pk>/<slug>/',views.detail,kwargs={'pk':10}), re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9] |1[0-2])/',views.students), ]
不管pk为何值,结果都是kwargs默认的10
kwargs在include中传递相当于把kwargs参数传递到相应app中所有的url。都添加了kwargs参数
-
url命名 :
页面重定向,可以通过导入 redirect 方法 重定向
from django.shortcuts import render,redirect # Create your views here. from django.http import HttpResponse def index(request): return redirect('https://baidu.com')
跳转到指定的页面(锚点):
def index(request): return HttpResponse('这是index页面') def login(request): return redirect('/teacher/index')
name 命名
如果url路径修改,这是可以通过name指定具体的名字,
from django.urls import path,re_path from . import views app_name = 'teacher' urlpatterns = [ path('home/',views.index , name = 'index'), path('login/',views.login ), path('detail/<int:pk>/<slug>/',views.detail), re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9] |1[0-2])/',views.students), ]
views 需要导入reverse 方法,直接指定到name定义的变量, 如何多个app中出现相同的变量,可以通过在urlconf中设置
app_name
定义在 app文件夹下的urlconf模块中
app_name = app名称from django.shortcuts import render,redirect,reverse # Create your views here. from django.http import HttpResponse def index(request): return HttpResponse('这是index页面') def login(request): url = reverse('teacher:index') return redirect(url)
2.django模板
html源码卸载模板文件中
-
模板设置-路径设置
setting.py里面设置 DIRS , BASE_DIR 当前目录
templets 你创建的模板文件夹
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templets')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug',
模板文件调用
需要设置views.py 导入 template
from django.template.loader import get_template
,
然后用方法get_template 调用具体的文件
通过render 方法渲染,最后返回HttpResponse(html)
from django.shortcuts import render,redirect,reverse from django.template.loader import get_template # Create your views here. from django.http import HttpResponse def index(request): tp = get_template('teacher/index.html') html = tp.render() return HttpResponse(html)