自我总结45

view.py 视图层

JsonResponse

HttpResponse  返回字符串
			
render  返回html页面  给html页面传值
			
redirect  重定向

视图函数必须有一个返回值 并且返回值的数据类型必须是HttpResponse对象

前后端分离,数据交互 该如何进行?

​ 通常情况下前后端数据交互采用的都是json的字符串(字典)

​ 后端只需要要写好响应的url接口前端访问你这个接口

​ 你只需要返回一个大字典即可 +开发文档

前后端序列化反序列都用哪些方法

python后端 js
json.dumps JSON.stringify
json.loads JSON.parse

JsonResponse

默认只能序列化字典类型,如果想序列化其他json能够支持的格式,需要加一个参数safe =Flase

当你的数据有中文的时候,如果你不想自动转码,你需要定制一个参数来告诉你需要动内部任何数据

借助于原生的json模块作为参考依据
	json.dumps(obj,ensure_ascii=False)
	阅读源码 发现 json_dumps_params = {}
	json.dumps(obj,cls,**json_dumps_params)

得出:
JsonResponse(obj,json_dumps_params={'ensure_ascii':False})

FBV和CBV

FBV: 基于函数的视图

CBV:基于类的视图

# 只要是处理前端请求的业务逻辑的视图函数 都需要加上request形参
from django.views import View
class MyLogin(View):
	def get(self,request):
		return render(request,'login.html')
							
	def post(self,request):
		return HttpResponse('post请求')
					
urs.py
url(r'^login/',views.MyLogin.as_view())
# 1.函数名加括号执行优先级最高
# 2.该方法要么是普通函数 要么是绑定给类的方法
自动变形
url(r'^login/',views.view)
						
内部源码 
def as_view(cls,**kwargs):
	def view(...):
		self = cls(...)  # 生成自己写的类的对象
		return self.dispatch(...)  # 一定要确认self到底是谁
		# 然后一定要问你一句 对象查找属性和方法的顺序(慢)
	return view
						
# 一旦用户敲了login 会自动加括号调用view函数
def dispatch(...)
    # 先判断当前请求方式在不在默认的八个请求方法内
    if request.method.lower() in self.http_method_allowed:
    # 利用反射 获取到方法名对应的属性或者是方法
        handler = getattr(self,request.method.lower(),error)
    else:
        # 提示报错
        handler = self.http_method_not_allowed
    return handler(...)  # 调用请求方法所对应的函数
如何给CBV加装饰器
	django推荐你使用内置的模块来给CBV加装饰器
	from django.utils.decorators import method_decorator
	# 1.直接在类上面装
		method_decorator(wrapper,name='给类内部哪个方法装')
	# 2.直接在类的内部方法上装
		method_decorator(wrapper)
	# 3.给类内部所有的方法都装  重写dispacth方法
		method_decorator(wrapper)

模板层

模板语法

两种格式

{{ }} 变量相关

{% %} 逻辑相关

模板语法传值

python所有的基本数据类型全部支持传值

传对象 {{ obj }}直接传对象 显示的是对象的内容地址 定义__str__来控制对象的展示

对象在html页面上可以调用绑定方法

传类名 {{ MyClass }}会自动加括号实例化 产生对象

传函数名 {{ index1 }}会自动加括号调用 并且函数如果需要参数 那么模板语法不支持

模板语法过滤器

会自动将 左边的数据当前过滤器的第一个参数传入|右边当作第二个参数

(最多只能有两个参数)

过滤器(提供了一些内置的方法) 解释
{{ s|length }} 统计长度(如果无法统计默认返回0)
{{ n|add:f }} 加法运算 (内部异常捕获 支持数字相加 字符串拼接 都不符合返回空)
{{ l|slice:'0:6:2' }} 切片操作 顾头不顾尾 也支持步长
{{ is_value|default:'is_value变量名指向的值为空' }} 判断是否有值(有值展示值本身 没值展示默认值)
{{ file_size|filesizeformat }} 自动转成文件大小格式
{{ s|truncatechars:8 }} 截取文本内容(字符) 截取五个字符 三个点也算
{{ s1|truncatewords:5 }} 截取文本内容(按照空格计算) 截取五个单词 三个点不算
{{ sss|safe }} 展示带有标签的文本

模板语法取值 只有一种方式 统一采用句点符

{{ comp_dic.hobby.2.2.age }}

前后端取消转义的方法

​ 前端

​ |safe

​ 后端

from django.utils.safestring import mark_safe
res = mark_safe('<a href='htttp://www.baidu.com'>点我</a>')

模板语法标签

if

for循环

# for和if 联合使用
{% for foo in l %}
	{% if forloop.first %}
		<p>这是我的第一次</p>
	{% elif forloop.last %}
		<p>这是最后一次了啊</p>
	{% else %}
		<p>{{ foo }}</p>
	{% endif %}
	{% empty %}
		<p>当for循环的对象是空的时候会走</p>
{% endfor %}

模板语法的取值 只有一种方式 统一采用句点符

{{ comp_dic.hobby.2.2.age }}

自定义过滤器和标签

django支持用户自定义,必须要先有三部准备

​ 1.在应用名下新建一个名字必须交templatetags的文件夹

​ 2.在该文件内 新建一个任意名称的py文件

​ 3.在该py文件的必须写两句话

from django.template import Library
				
register = Library()
# 之后就可以利用register来自定义过滤器和标签

自定义标签的使用 可以接收多个参数 参数与参数之间必须空格隔开

@register.simple_tag(name='mytag')
def mytag(a,b,c,d):
	return '%s?%s?%s?%s'%(a,b,c,d)

自定义inclusion_tag

是一个函数 能够接收外界传入的参数 然后传递给的一个html页面

页面上获得数据 渲染 完成之后

将渲染好的页面 放到调用inclusion_tag

@register.inclusion_tag('mytag.html',name='xxx')
def index666(n):
	l = []
	for i in range(n):
		l.append('第%s项'%i)
	return locals()  # 将l直接传递给mytag.html页面

模板的继承

先在你想要继承的页面上通过block划定你将来可能要改的区域

在子页面上先继承extends

利用block自动提示 选择你想要修改的内容区域

'''
模板上的block区域越多 页面的扩展性越强

一个模板页面至少有三块区域
			
css区域
			
html代码区域  可以设置多个block
			
js区域
			
有了这三块区域 就能够实现每一个页面都有自己独立的css和js代码

'''


# 例子
{% block css %}
	<style>
		p {
			color: green;
		}
	</style>
{% endblock %}


{% block content %}
<p>login页面</p>
{% endblock %}


{% block js %}
	<script>
		alert('login')
	</script>
{% endblock %}


# 在子页面上继续沿用父页面的内容
	{{ block.super }}

模板的导入

将html页面当做模块的直接导入使用

{% include '名字.html' %}
posted @ 2019-11-28 21:42  jzm1201  阅读(91)  评论(0编辑  收藏  举报