目 录
前言:关于Django视图层和模板层相关理论知识梳理
视图层 小白必会三板斧 HttpResponse render from django.template import Template,Context temp = Template("<h1> {{ user }} </h1>") con = Context({"user":[1,2,3,4]}) res = temp.render(con) return HttpResponse(res) redirect JsonResponse 返回一个json格式的字符串 前后端分离 后端给前端返回一个json的格式的字符串(大字典) 1.可以自己手动json序列化 import json class MyJsonEncode(json.JsonEncode): pass json.dumps(data,cls=MyJsonEncode,ensure_ascii=False) 2.JsonResponse 内部其实也是调了json.dumps JsonResponse(data,json_dumps_param={"ensure_ascii":False},safe=False) form表单上传文件 1.提交方式必须是post 2.需要将form标签的enctype属性由默认的urlencoded改为formdata 后端需要从request.FILES中获取上传的文件 django内部针对不同数据格式的数据 会解析到不同的方法中 request.GET request.POST request.FILES FBV与CBV 基于函数/类的视图 CBV 写视图函数 必须要写一个类 然后继续View from django.views import View class MyLogin(View): def get(self,request): return render(request,'login.html') def post(self,request): return HttpResponse('post请求') 路由配置 CBV源码 FBV url(r'^index/',views.index) CBV url(r'^login/',views.MyLogin.as_view()) # url(r'^login/',views.view) def as_view(cls,*args,**kwargs): def view(...): self = cls(...) return self.dispatch(...) return view def dispatch(...): # 判断当前请求方式在不在八个默认的请求方式中 get post delete options ... # 利用反射 获取对象的所对应的属性或者是方法 # 执行对应方法 django settings源码 django暴露给用户一个自定义配置的文件 用户配置了就用用户的 用户没有配置就使用默认的 并且配置文件中的变量名必须是大写才有效 from django.conf import settings settings = LazySettings() class LazySettings(object): ... class Settings(object): # 循环获取默认的配置文件中所有的大写配置 # 利用setattr给对象不停的设置键值对 # 再循环获取暴露给用户的自定义配置文件中所有的大写的配置 # 再利用setattr给对象不停的设置键值对 """字典的键存在的情况 再设值其实就是替换""" 模板层 {{}} 变量相关 {%%} 逻辑相关 模板语法传值 python基本数据类型 函数名 # 传函数名 会自动加括号调用 不支持传参 对象 模板语法获取容器类型的数据 只能采用句点符(.) 点索引 点键 模板语法之过滤器(|) 会将|左边的值当作第一个参数传入 右边的当作第二个参数传入 |add |default |length |slice |truncatechars # 截字符 三点也算 |truncatewords # 按空格截 三点不算 |filesizeformat |safe 前端 |safe 后端 from django.utils.safestring import mark_safe res = mark_safe("<h1>111</h1>") """前端代码不一定必须要在前端写好 也可以再后端写完 传递给前端页面""" 只要思想不滑坡 方法总比困难多 模板语法之标签 {%%} if判断 后端语法一模一样 for循环 内部提供了一个forloop对象 counter # 1开始 counter0 # 0开始 first last empty 当for循环对象是个空的时候 就会走empty下面的逻辑 with起别名 当一个数据是通过很复杂的方式获取到 好多地方有需要用 keys,values,items 自定义过滤器和标签 1.在应用下新建一个名字必须叫templatetags文件夹 2.在该文件夹下新建一个任何名称的py文件 3.在该py文件中 先固定写两行代码 from django.template import Library register = Library() @register.filter(name='过滤器的名字') def index(a,b): # 过滤器内部逻辑代码 ... # ...等价于pass @register.simple_tag(name='标签的名字') def login(a,b,c,*args): ... 模板的继承 很多页面的大部分区域长的都差不多的情况下 你可以考虑使用模板的继承 1,在你想用的那个页面上 通过block事先划定 你将来可能用得到的区域 {% block 名字 %} 模板内容 {% endblock %} 2,子板需要先继承模板 才能用到该模板中 事先划定的区域 {% extends 模板的名字 %} {% block 名字 %} 子板内容 {% endblock %} 一个模板页面通常应该有三个区域 {% block css %} {% endblock %} {% block content %} {% endblock %} {% block js %} {% endblock %} 模板的导入 通常情况下是将页面上的某一块区域当作一个模块 {% include 模块名 %}