视图概述

Django中的视图主要用来接受Web请求,并做出响应。

视图的本质就是一个Python中的函数

视图的响应分为两大类

  1. 以Json数据形式返回
  2. 以网页的形势返回

          重定向到另一个网页
          错误视图(40X,50X)

视图响应过程: 浏览器输入
-> 
django获取信息并去掉ip:端口,剩下路径 ->
urls 路由匹配 -

视图响应 ->
回馈到浏览器

配置url

配置流程:

  1. setting中指定根级url配置文件,对应的属性ROOT_URLCONF


  1. urlpatterns:一个url实例的列表,全在根配置搞定

      内部由url组成(正则匹配路径)
      url(r'^Learn/',views.learn)

  1. 导入其它url配置: 

  在应用中创建urls.py文件,编写匹配规则,在工程urls.py中进行
        导入包含
  from django.conf.urls import include
  urlpatterns = [ url('xxx/',include('App.urls'))
]

  1. 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\d{4})/(?P\d)+/(?P\d+)$',views.getNews),

实践: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的响应。
返回结果:


我们匹配时候是\d+,但是打印出来是字符串

urls总结

  • 路由器

    • 按照列表的书写顺序进行匹配的
    • 从上到下匹配,没有最优匹配的概念
  • 路由规则编写

    • 我们通常直接指定以 ^ 开头,新版本中没有^
    • 在结尾处直接添加反斜线
  • 路由路径中的参数使用 () 进行获取

    • 一个圆括号对应视图函数中的一个参数
    • 参数

      • 路径参数

        • 位置参数

          • 按照书写顺序进行匹配
        • 关键字参数

          • 按照参数名称匹配,和顺序就无关了
      • 参数个数必须和视图函数中参数个数一致(除默认的request以外)
  • 反向解析

    • 根据根路由中注册的namespace和在子路由中注册name,这两个参数来动态获取我们的路径
    • 在模板中使用  {% url 'namespace:name'  %}
    • 如果带有位置参数  {% url 'namespace:name'  value1 value2 [valuen...] %}
    • 如果带有关键字参数  {% url 'namespace:name' key1=value1 key2=value2 [keyn=valuen....] %}

作业讲解

做一个班级学生列表
功能:
 - 班级列表
 - 班级列表可点击
 - 点击的时候显示班级所有学生

  1. 建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)
  1. 添加数据


3.添加url

url('grades/', views.grades)
  1. view函数
def grades(request):
    grade_list = Grade.objects.all()
    return render(request, 'grade_list.html', context=locals())
    # locals()将局部变量使用字典的方式进行局部打包

知识点

  •  locals

       - 内置函数
 - 将局部变量,使用字典的方式进行打包
 - key是变量名,value是 变量中存储的数据

  1. 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>

访问:

可见班级列表

  1. 加点击

添加标签:先加一个空白链接,后续再完善

 <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>

这样我们就可以点击链接显示对应的学生名单了

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏