django(视图层)
试图函数必须返回一个HttpResponse 对象
三板斧
HttpResponse
返回字符串类型
render
返回html页面,并且在返回浏览器之前还可以给html文件传值
redirect
重定向
JasonResponse对象
json格式数据
前后端数据交互需要使用到Jason作为过渡,实现跨语言传输数据
1手动利用json模块
前端序列化
json.stringify() json.dumps()
json.parse() json.loads()
2利用JasonResponse
from django.http import JasonResponse
form表单上传文件及后端如何操作
form表单上传文件类型的数据
1method必须指定成post
2enctype必须转换成formdata
request对象方法
request.method 获取请求方式
request.POST 获取post请求的键值对数据,不包含文件数据
request.GET 获取get请求
request.FILES 获取文件数据
request.path 获取url
request.path_info
request.get_full_path() 获取完整的url及问候后面的参数
request.body 原生浏览器发过来的二进制数据
FBV于CBV
视图函数既可以是函数也可以是类
url (r ' ^login/' , views.Mylogin.as_view() )
from django.views import View
class Mylogin( View ):
def get( self , request):
return HttpResponse( 'get方法')
def post( self , request ):
return HttpResponse( 'post方法')
FBV和CBV各有千秋
CBV能够直接根据求情方式的不同直接匹配到对应的方法执行
CBV源码剖析
突破口在urls.py
url(r ' login/ ' , views.MyLogin.as_view( ) )
url(r ' login/ ' , views.view ) FVB一模一样
CVB于FVB在路由匹配上本质是一样的,都是路由对应函数内存地址
函数名、方法名 加括号执行优先级最高
as_view( )
要么是被@staticmethod修饰的静态方法
要么是被@classmethod修饰的类方法
查找self属性方法的顺序
对象本身找
产生对象的类中
类的父类们
模板语法传值
{ { } }:变量相关
{ % % }:逻辑相关
render支持两种方式给html传值
locals
字典
python所有的基本数据类型、函数名、类名、对象都可以被传到html上
针对函数名和类名,模板语法会自动加括号调用(但是不支持传递额外参数)
django模板语法的取值,是固定格式,只能采用‘句点符’
即可以点键也可以点索引,还可以两者混用
过滤器(过滤器最多只能有两个参数)
就类似于模板语法内置的内置方法
django内置有60多个过滤器,我们不需要学习那么多,了解10个
基本语法
{ { 数据 | 过滤器 :参数 } }
length 统计长度
default 默认值(第一个参数布尔值是True就展示第一个参数的值否则展示冒号后面)
filesizeformat 文件大小
date:'Y-m-d ' 时间格式
slice 切片操作
truncatechars 切取字符
truncatewords 切取单词
cut 移除特定字符
join 拼接
add 拼接(加法)
转义
前端
|safe
后端
from django.utils.safestring import mark_safe
res = mark_safe( <h1>xinxin</h1> )
以后你在全栈项目的时候,前端代码不一定非要在前端书写
也可以在后端写好,然后传递给前端页面
标签(一堆逻辑)
for循环
{ % for foo in l % }
{ { forloop } }
{ { empty } }
可迭代对象里面没有元素,无法for循环的时候自动走empty
{ % endfor% }
counter
counter0
first
last
if判断
{ % if b % }
{ % elif s % }
{ % else % }
{ % endif % }
for 和 if混合使用
处理字典其他方法
with起别名
{ % with data.0.name.1.password as t % }
{ % endwith % }
自定义过滤器、标签、inclusion_tag
先三步走
1在应用下创建一个名字“必须”叫templatetags文件夹
2在文件夹内创建“任意”名称的py文件
3在该文件内必须先书写下面两句话
from django import template
register = template.Library()
自定义过滤器(参数最多两个)
@register.filter( name = ' baby ' )
def my_sum( v1, v2)
return v1+v2
{ % load mytag %}
<p> { { n | baby :666 } } </p>
自定义标签(参数可以多个)
@register.simple_tag( name = 'plus' )
def index( a,b,c,d )
return '%s-%s-%s-%s'%(a,b,c,d)
便签多个参数彼此之间空格隔开
<p> { % plus 123 123 123 123 % } </p>
自定义inclusion_tag
内部原理
先定义一个方法
在页面上调用该方法,并且可以传值
该方法会生成一些数据然后传递给一个html页面
之后渲染好的结果放到调用的位置
@register.inclusion_tag( ' left_menu.html ' )
def left( n ):
data = [ '第{ }项'. format( i ) for i in range( n ) ]
return locals( )
{ % left 5 % }
总结:当html页面某一个地方的页面需要传递参数才能够动态的渲染出来,并且在多个页面
上都需要使用到该局部,那么考虑将该局部页面做成inclusion_tag形式
模板的继承
自己先选好一个你想要继承的模板页面
{ % extends 模板页面名 % }
继承之后子页面跟模板页面是一模一样的,你需要在模板页面上提前划定可以被修改的区域
{ % block content % }
模板内容
{ % endblock % }
子页面就可以声明想要被修改的哪块划定了的区域
{ % block content % }
子页内容
子版页面除了可以写自己的之外,还可以继续使用模板的内容
{ { % block.super % } }
{ % endblock % }
一般情况下模板页面上至少有三块可以被修改的区域
1css区域
2html区域
3js区域
利用模板的继承,能够让你的页面更好的维护
模板的导入
将页面的某一局部当成模块的形式,哪个地方需要就可以直接导入
{ % include 'home.html ' % }