Django视图
Django中视图函数,简称视图,相当于一个函数,接受客户端的请求的数据,进行处理,然后在响应给客户端。
http请求产生两个核心对象,分别为HttpRequest(请求)对象,HttpResponse(响应)对象,这两个方法在django.http目录下
HttpRequest属性
在views视图函数中定义的
request
就是HttpRequest
对象,监测可使用isinstance
方法来检测
HttpRequest
类在django.http.request
1 | def index(request): |
HttpResponse属性
对应HttpResponse对象来说,是由django自动创建,但httpresponse返回是我们自己去定义,每个view请求处理的方法返回必须是一个HttpResponse对象,
template里面的内容并不是html,只是一个模板,因为有渲染功能
HttpResponse
类在django.http.response
1 | def index(request): |
示例
1 | #写个登录页面如果,账号密码正确则跳到index页面 |
Django模板
Django 起初定义的html是被直接硬编码在python中,如下代码实例
1 | from django.shortcuts import render,HttpResponse |
这种方式便于解释视图是如何工作的,但是直接将html硬编码到视图不是什么好办法,
页面设计在进行改变都必须对python进行响应修改,站点设计的修改通常比底层python代码修改要多的多,因此如果不在进行python代码修改的情况下设计,那就更加方便。
试想一下,如果一个python开发人员又要设计html,又要写python代码,这样会很繁琐。专人专事,让前端的人搞前端,后端的人搞后端,前段调用后端数据,后端数据返回给前端。
基于这些,我们就可以使用django的模板系统(template system)来实现。
Template语法
模板组成:HTML代码+逻辑控制代码
语法格式:
使用双花括号表示变量
template和context对象
template里面都是html模板
context在视图函数中定义的变量
实例
1 | #python manage shell |
同一个模板:多个上下文,一旦有了模板对象,就可以通过他渲染多个context,无论何时都可以使用同一个模板渲染多个Context,只进行一次模板创建后多次调用render()方法会渲染会更加高效
1 | for name in ('zhuxy','yukw','zandy'): |
Django模板解析快捷,大部分的解析工作都是在后台通过对简短正则表达式一次性调用完成,这个基于xml的模板引擎成鲜明对比
这些引擎承担xml解析器的开销,且往往比Django模板渲染引擎要慢好几个数量级
1 | from django.shortcuts import render,HttpResponse |
Template查询
上面都是只有一层查询,如果是一个列表或者字典或者是一个对象该如何查询?
1 | class Animal(): |
Template调用
1 | 列表调用 |
Template过滤
1 | 过滤语法格式: |
Template标签
1 | 使用语法为:{% tag %}表示使用标签 |
判断
1 | 语法:{% if %} {% endif %} |
实例
1 | #判断年纪是否为18,如果18返回名称,如果不是18返回不能进入 |
循环
1 | 语法:{% for %} {% endfor %} |
实例
1 | #循环一个列表所有元素 |
计数
1 | {{ forloop.counter }} #计数从1开始 |
Template其他标签
1 | {% empty %} |
1 | {% csrf_token %} |
1 | {% url 'alias' %} |
1 | {% with %} |
1 | {% verbatime %} |
1 | {% load %} |
自定义filter和simple_tag
1 | 1.在app中创建template模块(必须) |
Template继承
如果一个页面叫index.html,如果想要用其他页面也嵌套index.html就可以使用继承,在index.html(也叫母板),添加
1 | {% block test %} |
1 | #如果想要修改样式该怎么办? |
注意事项
1 | 如果在母板中使用{% extends %}必须保证其为模板的第一个标记,否则模板不会继承作用 |