学习内容概要
- 网页伪静态
- 视图层
- 三板斧
- JsonResponse
- form表单上传文件
- FBV与CBV(核心)
- CBV源代码(面向对象)
- 模板层
- 模板语法传值
- 模板语法之过滤器
- 模板语法之标签
- 自定义过滤器、标签、inclusion_tag
内容详细
网页伪静态
- 本质:
- 将动态网页伪装成静态的网页 目的是提升网页被搜索引擎收录的概率 (提高搜索查询概率)
- 表现形式就是把网址的后面加上一个看着像一个具体文件路径的后缀
- 例如:path('inner.html',views.inner)
视图层
-
1、视图函数的返回值问题
- 视图函数必须返回一个 HttpResponse 对象
# 在视图层处理函数返回值的时候 目前需要使用三板斧去处理返回值 如果不处理 一般情况下就会返回None 从而会报错
# 在使用三板斧时 其实本质都是在使用 HttpResponse 去返回 因为:
# HttpResonse其实是一个类
# 验证:
class HttpResponse(HttpResponseBase):
pass
def render():
return HttpResponse(content, content_type, status)
def redirect(to, *args, permanent=False, **kwargs):
redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))
-
2.视图函数返回json格式数据
user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
# 方法1:
from django.shortcuts import render,reverse,HttpResponse,redirect
import json
def inner(request):
user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
json_str = json.dumps(user_dict,ensure_ascii=False)
return HttpResponse(json_str)
# 方法二:
from django.http import JsonResponse
def inner(request):
user_dict = {'name': 'jason老师', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
# 源码表现:
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if json_dumps_params is None:
json_dumps_params = {}
data = json.dumps(data, cls=encoder, **json_dumps_params)
# 序列化非字典类型的数据还需要指定safe参数为False(如列表、元祖、集合...)
-
3.form表单携带文件数据
- 前端 form 表单需要具备的条件
- 1.method属性值必须是post
- 2.enctype属性值必须是 multipart/form-data
- 后端获取文件数据的操作
- 1.request.FILES
- 前端 form 表单需要具备的条件
-
4.FBV与CBV
FBV:基于函数的视图
def index(request):
return HttpResponse()
path('index/', views.index)
CBV:基于类的视图
from django import views
class MyView(views.View):
def get(self, request):
return HttpResponse('我是CBV里面的get方法')
def post(self, request):
return HttpResponse('我是CBV里面的post方法')
path('func/', views.MyView.as_view())
"""
CBV会自动根据请求方式的不同匹配类中定义的方法并自动执行
"""
-
5.CBV源码分析(重要)
源码分析入口
path('func/', views.MyView.as_view())
1.绑定给类的as_view方法
def as_view(...):
def view(...):
pass
return view
2.CBV路由匹配本质:跟FBV是一致的
path('func/', views.view)
3.访问func触发view执行
def view(...):
obj = cls()
return obj.dispatch()
'''涉及到对象点名字 一定要确定对象是谁 再确定查找顺序'''
4.研究dispatch方法
def dispatch(...):
func_name = getattr(obj,request.method.lower())
func_name(...)
模板层
-
1.模板层语法传值
方式1:指名道姓 指名道姓传参 不浪费资源
return render(request, 'modal.html', {'name':name})
方式2:关键字locals() 将整个局部名称空间中的名字去全部传入简单快捷
return render(request,'inner.html',locals())
-
2.模板语法传值的范围
-
(1)基本数据类型直接传递使用(整型、浮点型、字符串、列表、字典、集合、元祖、布尔值)
-
(2)函数名的传递会自动加括号去调用 没有返回值 直接显示 None
- 如果函数有参数不会执行也不会显示 模板语法不支持有参函数
-
(3)类名的传递会自动加括号生产对象并展示在页面上
- 对象调用会直接显示在页面上
-
(4)注意:模板语法会判断每一个名字是否可调用 如果可以则直接显示调用
-
-
3.模板语法过滤器(类似于python中的内置函数)
# 在 views 页面写好数据 HTML 页面直接使用模板语法过滤器
<p>统计长度:{{ s|length }}</p>
<p>加法运算:{{ i|add:123 }}、加法运算:{{ s|add:'hahaha' }}</p>
<p>日期转换:{{ s|date:'Y-m-d H:i:s' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>数据切片:{{ l|slice:'0:15' }}</p> # 索引超出也不会报错 直接显示容器内最后一个数据值
<p>字符截取(三个点算一个):{{ s1|truncatechars:5 }}</p>
<p>单词截取(空格):{{ s1|truncatewords:5 }}</p>
# 在后端 ivews 页面直接编写前端标签 在前端页面直接用|safe 去转义就可以使用了
<p>语法转义:{{ script_tag|safe }}</p>
<p>语法转义:{{ script_tag1|safe }}</p>
# 下述方法是在后端直接调用模块 编写前端数据 不需要在前端用|safe 转义 也可以直接传入使用
from django.utils.safestring import mark_safe
script_tag2 = '<script>alert(100)</script>'
res = mark_safe(script_tag2)
"""
django模板语法中的符号就两个 一个{{}} 一个{%%}
需要使用数据的时候 {{}}
需要使用方法的时候 {%%}
"""
-
4.模板语法标签(类似于python中的流程控制)
- 关键字:forloop
# if...elif...else
{% if 条件 %} 条件一般是模板语法传过来的数据 直接写名字使用即可
条件成立执行的代码
{% elif 条件1 %}
条件1成立执行的代码
{% else %}
条件都不成立执行的代码
{% endif %}
# for循环套if分支
l = [11,22,33,44,55,66]
{% for i in l %}
{% if forloop.first %}
<p>这是第一次哟~</p>
{% elif forloop.last %}
<p>这是最后一次!</p>
{% else %}
<p>{{ i }}</p>
{% endif %}
{% empty %} # 用来判断in后面的数据是否为空
<p>in后面数据为空 循环不了</p>
{% endfor %}
# 循环打印的结尾为:数据的头和尾会被 forloop.first和forloop.last 代替接收
-
5.自定义标签函数、过滤器、inclusion_tag
-
(1)如果想自定义 必须先做以下三件事
-
(2) 在应用下创建一个名为templatetags文件夹
-
(3) 在该文件夹创建任意名称的py文件
-
(4)在该py文件内编写自定义相关代码
- 先到模块:
- from django.template import Library
- register = Library()
- 先到模块:
from django.template import Library
register = Library()
# 自定义过滤器(过滤器最多两个参数)
@register.filter(name='myfilter') # 起别名
def my_add(a, b):
return a + b
# 使用方法:先调用{% load 文件名 %} {{数据类型|myfilter:数据值}}
========================================================================
# 自定义标签函数(多个参数)
@register.simple_tag(name='mytag') # 起别名
def func(a, b, c, d):
return a + b + c + d
# 使用方法:直接在{% mytag 1 2 3 4 %}
=========================================================================
# 自定义inclusion_tag
@register.inclusion_tag(filename='it.html')
def index(n):
html = []
for i in range(n):
html.append('第%s页'%i)
return locals()
-
6.模板的继承
- 关键字:extends
{% extends 'html文件名' %}
{% block 名字 %}
模板内容
{% endblock %}
{% block 名字 %}
子板内容
{% endblock %}
一般情况下母板中至少应该有三个区域使得扩展性更高!!!
# 三大区域:css content js
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
# 注意:子板中还可以使用母板的内容
继承母板: {{ block.super }}
- 7.模板的导入
- 关键字:inclyde
# 创建一个HTML页面 然后编写一些css、js...内容 并且把这块内容当做模板的形式去导入使用
# 导入方法:{% inclyde 'fixed.html'%}
标签:return,视图,Django,语法,json,模板,2022.9,def
From: https://www.cnblogs.com/55wym/p/16656326.html