url路由分配以及模板渲染方式
一,url基本概念和格式
1.1,基本概念
是一个网址,全球统一资源定位符,作用:用来标识互联网上资源的地址。
1.2,格式
二,django的路由系统(url配置)
2.1,路径访问出错
三,path和re_path(在新的app里面则需要自己创建一个urls.py文件)
3.1,path
# 1,基本格式
urlpatterns = [
path('admin/', admin.site.urls, kwargs=None, name=None)
]
# 2,从url中传入参数
path('detail/<name>/', views.detail) # 在路径的后面使用<>进行参数捕捉,<>里写参数
# 3,路径转换器(默认str类型)
path('detail/<int:name>', view.detail) # 插入的name必须是数字
# 4,在路径中传入多个参数
path('detail/<int:id>-<str:name>/', views.detail) # 写法一
path('detail/<int:id>/<str:name>/', views.detail) # 写法二
3.2,re_path
# 1,基本格式
urlpatterns = [
re_path('admin/', admin.site.urls, kwargs=None, name=None)
]
# 2,使用正则表达式
re_path(r'student/(?P<id>\d+)/(?P<name>[a-z]+)', views.student)
# ?P是给分组命名,<>里面写参数名,后面写正则表达式,用来匹配<>里的东西
3.3,include(访问其他app的urls)
# 1,在根urls.py文件的path下用include把其他APP的路由导入
path('student/', include('student.urls'))
# 当访问student的时候回跳转到student这个app下的urls下
# 注意,如果在根目录下传参,必须在每个App下都设置能传参的视图函数
3.4,kwargs(默认给参数,最高优先级)
path('student/', include('student.urls')),
path('hello/<name>', views.hello, kwargs={'name': 'xyb'})
def hello(request, name):
return HttpResponse('{}是多余的'.format(name))
# 若已经定义了kwargs,后面再传入的参数不生效,kwargs先生效
3.5,name
from django.shortcuts import render, reverse, redirect
path('login/', views.login)
def login(request):
return redirect('https://www.baidu.com/')
# 重定向,当访问login时,跳转到百度的页面
path('login/', views.login)
def login(request):
return redirect('hello/')
# 当访问login/时,会直接跳转到根目录下的hello的视图,不灵活,主路径改了都得改
path('hello/', views.hello, kwargs={'name': 'xyb'}, name='hahaha') # 命名成hahaha
def login(request):
return redirect(reverse('hahaha')) # 动态解析路径
# 当访问视图函数login的时候自动跳转到当前App命名为hahaha的路径
3.6,app_name
# 在每一个APP的url配置里前面加上app_name = App名
app_name = 'student'
def login(request):
return redirect(reverse('student:liu'))
# 代表了student下的index,不会和同名的重复
# 也可以用这个动态解析app_name跳到别的App下的视图函数内
3.7,路由系统原理
1,从根url里面找,找到第一个匹配到的路径,再到其对应的视图函数里
2,从根url里面找,通过include跳到对应的App下的路由里,再找路径,再去对应的视图函数
3,若找不到返回404
四,django模板路径配置
1),放在根目录下的templates设置
# 1,在根目录CRM创建一个templates(工用)文件夹,专门用来放置模板
# 2,设置seting.py文件里面的TEMPLATES里面的'DIRS':
'DIRS': [os.path.join(BASE_DIR, 'templates')]
2),单独放在App下的templates
# 1,创建一个新的App,把他下载到pycharm中
python manage.py startapp App名
# 2,确认seting.py文件里面的TEMPLATES里'APP_DIRS': True(允许访问app下的templates)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'student' # 把你的app名添加到这里,前提是这个app里有templates
]
五,django模板渲染方式
from django.shortcuts import redirect, reverse, render
from django.template.loader import get_template
def html(request):
t = get_template('student/index.html')
html = t.render()
return HttpResponse(html)
# student为根目录templates文件夹下面的App,在通过HttpResponse返回页面
urlpatterns = [
path('index/', views.index)
]
def index(request):
return render(request, 'student/index.html')
# 更加简便的方法
# 导入当前app下的templates下的模板
def index(request):
return render(request, 'index.html')
# 导入根目录下的templates下的模板
def index(request):
return render(request, 'student/index.html')