20190319Django路由分配与模板渲染
I. 路由系统
1. url全球统一定位符:
分为协议、域名(包括IP地址和端口)、路径(或者叫内部url,路由就是根据这个进行请求的分发)和参数(在问号后面,#xxxx是锚点)
<此处插入url构成图片解析>
变量urlpatterns是路由
URLconf模块,也就是url配置模块 > url.py
项目文件夹下的urls.py文件叫根配置文件
urlpatterns = [ path('admin/',admin.site.urls), path('teacher/', include('teacher.urls')), path('index/',view.index_view ) ]
">
2. path函数
path(route,view,kwargs=None,name=None)
注意,view不要加括号,加括号就变成了参数了。
- route 是一个字符串url规则
- view 是一个视图函数,
- kwargs 额外的参数,是一个字典
- name url规则的名字
crm系统,获取某个学生的详情,数据库,主键
3. 在urls里面捕获一个参数
备注:pk = primary key 主键。在urls模块里面的"pk"必须与views模块里的形参"pk"一致,否则会报错
<>代表捕获参数,所以一定要加尖括号
views.py文件中:
from django.contrib import admin from django.urls import path, include, re_path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('teacher/', include('teacher.urls')), path('student_detail/<str:pk>/', views.student_detail_view), path('students/<int:year>-<int:month>/', views.students_list_view), re_path(r'student_detail/?P<pk>\d+)', views.students_list_view), re_path(r'^students/(?P<year>\d{4})-(?P<month>[1-9]|1[0-2])$', views.students_list_view), ]
4. 转换器
- str匹配除了路径分隔符“/”之外的所有字符串,如果不写转换器,默认就是字符串转换器
- int匹配0或任意整数
- slug匹配任意的ASCII字符或数字组成的slug字符串,连字符和下划线
- path匹配任意非空字符串,包括路径分隔符‘/’
应用如:
上述例子中捕获参数的pk值前面加上"int:":
<int:pk>
代码例子如下:
crm目录下的views模块中:
from django.http import HttpResponse def student_detail_view(request, pk): #通过pk去数据库里取值 print(type(pk)) # 打印pk值的类型 return HttpResponse('学生ID为:%s的详情'% pk)
crm目录下的urls模块中:
urlpatterns = [ path('student_detail/<int:pk>/',views.student_detail_view), ]
运行结果:
<插入crm获取学生详情程序运行后浏览器访问页面>
扩展:如果输入多于一个参数的情况应该怎么做呢?
例子:
crm目录下的views模块中:
from django.http import HttpResponse def students_list_view(request, year, month): return HttpResponse('%s年%s月报名学生表'% (year, month)
crm目录下的urls模块中:
urlpatterns = [ path('students/<int:year>/<int:month>/',views.students_list_view), ]
运行结果:
<插入crm获取学生报名的年份和月份>
5. 使用正则表达式
re_path(route, view, kwargs=None, name=None)
学生详情的例子:
crm目录下的urls模块中代码如下:
from django.contrib import admin from django.urls import path, include, re_path from . import views urlpatterns = [ re_path(r'student_detail/(?P<pk>\d+)/',views.student_detail_view), ]
运行结果:
学生报名表的例子
crm目录下的urls模块中代码如下:
from django.contrib import admin from django.urls import path, include, re_path from . import views #导入同目录下的views模块 urlpatterns = [ re_path(r'^students/(?P<year>\d{4})-(?P<month>(0?[1-9]|1[0-2]))/$', views.students_list_view), ]
crm目录下的views模块中:
from django.http import HttpResponse def students_list_view(request, year, month): return HttpResponse('%s年%s月报名学生表'% (year, month)
运行结果:
![正则crm获取学生报名的年月截图2019-12]](https://img-blog.csdnimg.cn/2019032212075163.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjM3MTIw,size_16,color_FFFFFF,t_70)
![正则crm获取学生报名的年月截图报错]](https://img-blog.csdnimg.cn/20190322120822952.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjM3MTIw,size_16,color_FFFFFF,t_70)
注意: 正则表达式匹配的参数都会转换成字符串str
路由匹配的规律:只要匹配到就返回,前面的匹配会覆盖后面的匹配
路由是不区分请求方法的
额外参数
crm目录下的urls模块中代码如下:
from django.contrib import admin from django.urls import path, include, re_path from . import views #导入同目录下的views模块 urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',include('teacher.urls')), path('student/',include('student.urls')), path('student_detail/<int:pk>/',views.student_detail_view, kwargs={'args1':'value1','args2':'value2'}), ]
此时在根目录的urls中添加了额外参数args1和args2键值对,则必须在对应的views.py里添加kwargs额外参数
crm目录下的views模块中:
from django.http import HttpResponse def index_view(request): return HttpResponse('I am Homepage') def student_detail_view(request, pk, arg1, arg2): #通过pk去数据库里取值 print(type(pk)) return HttpResponse('学生ID为:%s的详情'% pk)
Note: 当额外参数与url参数冲突时(键名一致),以额外参数为准
6. url命名
redirect重定向:接收一个地址就能跳到该地址页面
示例:在teacher的app目录下:
先在teacher目录下的views模块中:
from django.shortcuts import render, redirect from django.http import HttpResponse def index(request): return HttpResponse('<h1 style="color:blue">This is my 1st django project!</h1>') def login_view(request): #追加定义login_view函数 return redirect('/teacher/index/')
再在teacher目录下的urls模块中输入代码如下:
from django.urls import path from . import views urlpatterns = [ path('index/', views.index), path('login/', views.login_view) ]
*追加path()输入路径login,以及views方法对应的login_view函数
以上视图中重定向写法/teacher/index这种写法是硬编码,当app多的情况下,这种重定向都需要手动去改,效率会非常低。因此,动态生成重定向的方法reverse被引入:
reverse方法
依旧以teacher的应用为例:思路是,先在views模块当中的path函数中追加定义变量名为index的变量,然后将这个变量引入到urls模块当作为变量传入reverse方法中,通过这个新的变量,返回重定向,则避免了硬编码的出现。
先在teacher目录下的urls模块中输入代码:
from django.urls import path from . import views urlpatterns = [ path('home/', views.index, name='index'), path('login/', views.login_view) ]
然后在teacher目录下的views模块中输入代码:
from django.shortcuts import render, redirect from django.http import HttpResponse def index(request): return HttpResponse('<h1 style="color:blue">This is my 1st django project!</h1>') def login_view(request): home_url = reverse('index') return redirect(home_url)
app_name方法
当不同app之间都有重定向的场景,为了区分不同app之间的重定向,我们需要对index进行区分,此时会用到app_name来定义一个新的变量,将对应的app名传入其中,在将视图中的index改为app_name:index。示例如下:
在teacher目录下的urls.py模块中代码如下:
from django.urls import path from . import views app_name = 'teacher' # 新增app_name传入变量值 urlpatterns = [ path('home/', views.index, name='index'), path('login/', views.login_view), ]
在teacher目录下的views.py模块中代码如下:
from django.shortcuts import render, redirect, reverse from django.http import HttpResponse def index(request): # return redirect('https://www.shiguangkey.com') return HttpResponse('<h1 style="color:blue">This is my 1st django project!</h1>') def login_view(request): home_url = reverse('teacher:index') # 将reverse方法中的变量值改为teacher:index,也就是app的名字后面跟着index。 return redirect(home_url)
II. 模板系统
Step1: 在项目根目录创建templates目录
Step2: 在项目文件夹crm中找到settings.py模块,在其中找到TEMPLATES的函数,在’DIRS’:[]中做一个路径拼接,‘DIR’:[os.path.join(BASE_DIR,‘templates’)],代码如下:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], #输入路径拼接 'APP_DIRS': Tru 20000 e, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
Step3: 在templates目录下创建teacher目录,再在该目录内创建index.html文件,打开html文件,在body标签下,新增h1标签并输入一段文字,并且给该段h1标签的文字设置一下格式:
<h1 style="color:gold;">This is the homepage of Django Framework Term 7</h1>
也可以添加一张图片让显示的页面更美观些:
<img src="图片url链接" alt="">
Step4: 在项目crm目录中点views.py视图文件进行编辑,
写法一:
from django.shortcuts import render, redirect, reverse from django.http import HttpResponse from django.template.loader import get_template # 从django框架的template模块的loader模块中,导入get_template函数 def index(request): t = get_template('teacher/index.html') html = t.render() # 设置变量html,传入t.render方法 return HttpResponse(html) def login_view(request): home_url = reverse('teacher:index') return redirect(home_url)
写法二(简洁):
from django.shortcuts import render, redirect, reverse from django.http import HttpResponse from django.template.loader import get_template # 从django框架的template模块的loader模块中,导入get_template函数 def index(request): return render(request,'teacher/index.html') def login_view(request): home_url = reverse('teacher:index') return redirect(home_url)
运行之后,用浏览器访问127.0.0.1:8000/teacher/login/模块
- 03-url路由分配模板渲染方式
- 2018-05-29-Django-02url路由配置及模板渲染方式
- 利用vue-router的动态路由和路由传值实现同一模板渲染不同数据
- Ember.js 入门指南——番外篇,路由、模板的执行、渲染顺序
- 13.django入门01(django入门初探视图,模板,路由)
- Python菜鸟之路:Django 路由、模板、Model(ORM)
- Django之路由、模板和模型系统
- Laravel框架模板加载,分配变量及简单路由功能示例
- [Django模板系统]Django的模板渲染(render)机制
- 啦啦啦啦~Django1.96---Django的模板渲染(render)机制
- 详解django中url路由配置及渲染方式
- 我的Laravel学习之路之模板加载,分配变量,简单路由
- Django入门教程(四)模板的查找顺序与渲染及过滤器的使用
- Python日记——Django模板的渲染
- Django的render(模板渲染)机制
- Django之路由、模板和模型系统 (转载)
- Django学习笔记1 [路由机制,数据库orm,模板语言]
- Django之模板HTML(模板渲染(字符,列表,字典),继承母版(extends ,extends), templatetags(simple_tag,filter))【交互篇三】
- Django之路由、模板和模型系统
- Django 视图,模板,路由规则