视图概述
Django中的视图主要用来接受Web请求,并做出响应。
视图的本质就是一个Python中的函数
视图的响应分为两大类
- 以Json数据形式返回
- 以网页的形势返回
重定向到另一个网页
错误视图(40X,50X)
视图响应过程: 浏览器输入
->
django获取信息并去掉ip:端口,剩下路径 ->
urls 路由匹配 -
视图响应 ->
回馈到浏览器
配置url
配置流程:
- setting中指定根级url配置文件,对应的属性ROOT_URLCONF
- urlpatterns:一个url实例的列表,全在根配置搞定
内部由url组成(正则匹配路径)
url(r'^Learn/',views.learn)
- 导入其它url配置:
在应用中创建urls.py文件,编写匹配规则,在工程urls.py中进行
导入包含
from django.conf.urls import include
urlpatterns = [ url('xxx/',include('App.urls'))
]
- url匹配正则注意事项:
正则匹配时从上到下进行遍历,匹配到就不会继续向后查找了,没有最优匹配
注意:
我们在urls中添加
url('hehe/',views.hehe),
url('hehehe/', views.hehehe),
然后在views中添加
def hehe(request):
return HttpResponse('hehe')
def hehehe(request):
return HttpResponse('hehehe')
这时访问hehehe时结果:
结果为hehe的返回值,这就是因为url在匹配时从上往下匹配
匹配的正则前方不需要加反斜线
正则前需要加
(r)表示字符串不转义
urls组成
获取路径与url有关,获取后面的参数和url无关
如果需要从url中获取一个值,需要对正则加小括号
url(r'^grade/(\d+)$',views.getStudents),
注意,url匹配中添加了
() 取参,在请求调用的函数中必须接收 def
getStudents(request,classId):
如果需要获取url路径中的多个参数,那就添加多个括号,默认按照顺序匹配路径名字
url(r'^news/(\d{4})/(\d)+/(\d+)$',views.getNews),
匹配年月日
def getNews(request,year,month,day):
参数也可以使用关键字参数形势
url(r'^news/(?P
实践:url匹配参数
新建app two
注册,设置子路由
在two.urls添加:
urlpatterns = [
url('students/$', views.students), # 获取多个学生
# $ 是表示字符串末尾也需要匹配,相当于从末尾进行匹配
url('students/(\\d+)/', views.student),
# 正则使用圆括号提取数据,圆括号内写匹配规则
# \d表示数字,多了一道\,表示正则表达式受到保护,不被字节码编译器解释。
# +表示出现至少一次
# 正则表达式提取的参数要和views中对应的参数一一对应
]
对应的views:
from django.http import HttpResponse
from django.shortcuts import render
def students(request):
return HttpResponse('get students success')
def student(request, s_id): # 一个url圆括号,对应一个参数
print(s_id)
print(type(s_id))
return HttpResponse('get student success')
url匹配是从上到下匹配,匹配到第一个students时会匹配成功,所以我们通过$正则匹配进行筛选,否则当我们访问单个学生匹配数字时,返回的还是students的响应。
返回结果:
urls总结
路由器
- 按照列表的书写顺序进行匹配的
- 从上到下匹配,没有最优匹配的概念
路由规则编写
- 我们通常直接指定以 ^ 开头,新版本中没有^
- 在结尾处直接添加反斜线
路由路径中的参数使用 () 进行获取
- 一个圆括号对应视图函数中的一个参数
参数
路径参数
位置参数
- 按照书写顺序进行匹配
关键字参数
- 按照参数名称匹配,和顺序就无关了
- 参数个数必须和视图函数中参数个数一致(除默认的request以外)
反向解析
- 根据根路由中注册的namespace和在子路由中注册name,这两个参数来动态获取我们的路径
- 在模板中使用 {% url 'namespace:name' %}
- 如果带有位置参数 {% url 'namespace:name' value1 value2 [valuen...] %}
- 如果带有关键字参数 {% url 'namespace:name' key1=value1 key2=value2 [keyn=valuen....] %}
作业讲解
做一个班级学生列表
功能:
- 班级列表
- 班级列表可点击
- 点击的时候显示班级所有学生
- 建models
from django.db import models
class Grade(models.Model):
g_name = models.CharField(max_length=16)
class Student(models.Model):
s_name = models.CharField(max_length=16)
s_grade = models.ForeignKey(Grade,on_delete=models.CASCADE)
- 添加数据
3.添加url
url('grades/', views.grades)
- view函数
def grades(request):
grade_list = Grade.objects.all()
return render(request, 'grade_list.html', context=locals())
# locals()将局部变量使用字典的方式进行局部打包
知识点
- locals
- 内置函数
- 将局部变量,使用字典的方式进行打包
- key是变量名,value是 变量中存储的数据
- grade_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>grade_list</title>
</head>
<body>
<ul>
{% for grade in grade_list %}
<li>{{ grade.g_name }}</li>
{% endfor %}
</ul>
</body>
</html>
访问:
可见班级列表
- 加点击
添加标签:先加一个空白链接,后续再完善
<li><a href=""></a>{{ grade.g_name }}</li>
7.添加获取学生列表的函数给链接
我们要获取某一个班级的函数,所以采用正则匹配
首先添加url:
url('students/(\\d+)/', views.students),
一个圆括号代表一个参数,所以views函数就要多一个参数,这里要带一个班级的id
views:
def students(request, g_id):# 接收g_id
return HttpResponse('get students success')
再添加给标签空链接上
<li><a href="/two/students/{{ grade.id }}/">{{ grade.g_name }}</a></li>
已经成功加上链接
8.对应链接返回对应的班级学生名单
views函数:
def students(request, g_id):
student_list = Student.objects.filter(s_grade=g_id)
return render(request,'grade_student_list.html',context=locals())
# locals()就相当于之前的 context= {},data= {} 然后传输数据
新建一个grade_student_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>gradestudentlist</title>
</head>
<body>
<ul>
{% for student in student_list %}
<li>{{ student.s_name }}</li>
{% endfor %}
</ul>
</body>
</html>
这样我们就可以点击链接显示对应的学生名单了
此处评论已关闭