三板斧
HttpResponse:返回字符串类型
render:返回html,并且可以给页面传值
redirect:重定向
视图函数必须要返回一个httpresponse对象
JsonResponse对象
数据交互需要使用json过度,实现跨语言数据传输
from django.http import JsonResponse
JsonResponse(user_dict)
文件上传
form上传文件类型的数据:method必须指定成post;enctype必须制定为multipart/form-data
file_obj = request.FILES.get('file')
file_obj.name
with open(file_obj.name,'wb') as f:
for line in file_obj.chunks():
f.write(line)
request对象方法
request.methdo
request.POST
request.GET
request.FILES
request.path 只能拿到路由
request.get_full_path 也能拿到?后面的信息
request.path_info 只能拿到路由
request.body 原生的浏览器发过来的二进制数据
CBV
views:
from django.views import View
class MyLogin(View):
def post(request):
pass
def get(request):
pass
urls:
url(r'^login/',views.MyLogin().as_view())
模板语法
1.可以传递python所有数据类型
{{}}:变量相关
{%%}:逻辑相关
2.函数名放在模板语法内,会加括号自动调用,但是模板语法不支持给函数传额外的参数,而且不会报错,不会执行
3.类名放在模板语法呢,也会加括号自动调用,也就是实例化,对象是可以被传递的,对象被展示到html页面上,会触发__str__方法
4.django模板语法的取值是固定的格式,只能采用句点符号,就是.
过滤器
类似于模板语法内置的一些方法,Django内置有60多个过滤器
{{ 变量名|过滤器:参数 }}
{{ s|length }} 长度
{{ b|default: }} 类似于字典的get,前面布尔值如果为true,返回第一个,不然返回第二个
{{ f|filesezeformat: }} 计算文件的大小
{{ d|date:'Y-m-d' }} 格式化时间
{{ l|slice:'0:4:2' }} 切片,支持步长
{{ info|truncatechars:9 }} 摘要处理,截取字符,三个点也算
{{ e|truncatewords:9 }} 截取单词,不包含三个点,只会按空格截取
{{ msg|cut:'' }} 移除特定的字符
{{ l|join:'#' }} 拼接操作
{{ n|add:10 }} 拼接操作,包含加法,字符串
{{ h|safe }} 转义
from django.utils.safestring import mark_safe
res = mark_safe()
for循环
forloop.counter0 索引
forloop.first 第一次为true
forloop.last 最后一次为true
with语法
{% with info as i %}
在with语法内,可以通过别名快速地使用到前面的句式
{% endwith %}
自定义过滤器、标签、inclusion_tag
先三步走:
1.在应用下创建一个名字必须叫templatetags文件夹
2.在该文件夹内创建任意名称的py文件
3.在该py文件内必须先书写下面两句话(单词一个都不能错):
from django import template
resigter = template.Library
# 过滤器,最多有两个参数
@register.filter(name='baby')
def my_func(v1,v2):
return v1 + v2
{% load my_tag %} # 加载py文件
{{ n|baby:2 }}
# 标签,参数可以有多个
@register.sample_tag(name='plus')
def my_sample(a,b,c,d):
return a+b+c+d
{% load my_tag %} # 加载py文件
{% plus 'jason' a b c d %} # 参数之间用空格隔开
# inclusion_tag
@register.inclusion_tag('left_menu.html')
def my_inctag(n):
data = ['第{}项'.format(i) for i in range(10)]
return locals() # 将data传给left_menu.html
{% left 10 %} # 当html页面某一个地方页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部,那么就考虑将该局部部页面做成inclusion_tag形式
模板的继承
{% extends 'home.html' %} # 继承了整个html页面
# 模板页面需要变动的地方如何处理?
{% block content %} # 对需要变化的页面做一个标记,叫content
{% endblock %}
# 然后,在子页面中
block + tab
{% block content %}
自己独有的内容
{% endblock %}
模板的导入
# 将页面的某一个局部当成模块的形式,哪个地方需要导入即可
{% include 'xx.html' %}