django之初级模版语法与返回对象

  • 网页伪静态
  • 视图层
    • 三板斧
    • JsonResponse
    • form表单上传文件
    • FVB与CBV
    • CBV源码
  • 模版层
    • 模版语法
    • 模版语法之过滤器
    • 模版语法之标签
    • 自定义过滤器,标签,inclusion_tag

网页伪静态

将动态网页伪装成静态网页从而提升搜索引擎收录的概率
表现形式就是网址看着像一个文件的路径
path('home.htlm',view.home)

视图层

1.视图函数的返回值问题
	视图函数必须返回一个HttpResponse对象
	注意HttpResonse其实是一个类
	class HttpResponse(HttpResponseBase):
		pass
	def render():
		return HttpResponse(...)
	def redirect(to, *args, permanent=False, **kwargs):
		redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
		return redirect_class(resolve_url(to, *args, **kwargs))
2.视图函数返回Json格式字符串
import json
from django.http import JsonResponse
def home(request):
    user ={'name': 'jason','hobby':['打篮球','洗脚','足浴']}
    # json_str = json.dumps(user, ensure_ascii=False)  # 正常json取消中文编码
    # return HttpResponse(json_str)
    return JsonResponse(user, json_dumps_params={'ensure_ascii': False})  # 源码推导

image

序列化非字典类型字符串会报错
TypeError at /app01/home/
In order to allow non-dict objects to be serialized set the safe parameter to False.
需要指定safe参数为False

return JsonResponse(具体数据, json_dumps_params={'ensure_ascii':False},safe=False)

image

pycharm 读取图片文件需要转成png后缀

form 表单携带文件数据

1.form 表单参数需要修改
 <form action="" method="post" enctype="multipart/form-data">
'''method参数需为post 添加参数enctype = multiple/form-data'''
2.后台接收的时候需要使用file_obj = request.FILES.get()获取文件数据 
接收浏览器传的数据使用'''FILES'''传过来的是一个文件对象
<input type='file' multiple name='file'>
发送多个文件可以修改参数即可后段获取的时候是列表套对象
getlist获取多个文件数据
分开写入文件中
文件对象可以点name拿到文件名
文本输入没有点name属性

FBV与CBV

FBV函数编写视图
FBV:基于函数的视图:
			def index(request):
				return HttpResponse()
			path('index/', views.index)

CBV类编写视图:

from django import views


	class MyView(views.View):  # 继承view中的View
		def get(self, request):  # 必须接收request参数
			return HttpResponse('get方法')
		def post(self, request):
			return HttpResponse('post方法')
路由编写:
 path('reg/', views.MyView.as_view())  # 路由视图点视图点类名.类里面的as_view方法绑定给类的方法调函数将类自动传入
 path('reg/', views.view)
'''CBV会自动根据请求方法执行类中的函数'''

常见请求方法:
"""http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']"""

image

image

image
分析步骤

源码分析入口
    	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:指名道姓		指名道姓传参 不浪费资源 
def login(request):
    name = 'jason'
    return render(request, 'modal.html', {'username':name})   # 键username是在html页面使用的name是当前页面变量
方式2:关键字locals()将整个局部空间中的所有名字全部传入
return  render(request,'modal.html,locals())


2.模版语法传值的范围
基本数据类型直接传递使用
函数名的传递会自动加括号执行并将返回值展示到页面上
注意函数如果有参数则不会执行也不会展示模版语法不支持有参函数
类名的传递也会自动加括号产生对象并展示到页面上
对象的传递直接展示
根据语法会判断每一个名字是否可调用如果可以则调用

#django的模版语法在操作容器类型的时候只能允许使用句点符

3.模版语法过滤器(类似于内置函数)
<p>统计长度:统计长度:{{ 变量名|length }}</p>
<p>加法运算:{{ i|add:123 }}</p>
<p>日期转换:{{ s|date:'Y-m-d H:i:s' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>数据切片:{{ l|slice:'0:10' }}</p>
<p>字符截取(三个点算一个):{{ s1|truncatechars:6 }}</p>
<p>单词截取(空格):{{ s1|truncatewords:6 }}</p>
<p>语法转义:{{ script_tag|safe }}</p>
from django.utils.safestring import mark_safe
script_tag1 = '<script>alert(666)</script>'
res = mark_safe(script_tag1)
有时候html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入



''django模板语法中的符号就两个 一个{{}} 一个{%%}
需要使用数据的时候 {{}}
需要使用方法的时候 {%%}''


4.模板语法标签(类似于python流程控制)
	{% if 条件 %}  条件一般是模板语法传过来的数据  直接写名字使用即可
        条件成立执行的代码
    {% elif 条件1 %}
 		  条件1成立执行的代码
    {% else %}
       	 条件都不成立执行的代码
    {% endif %}

{% for i in s %}
        {% if forloop.first %}
            <p>这是第一次哟~</p>
        {% elif forloop.last %}
            <p>这是最后一次!</p>
        {% else %}
            <p>{{ i }}</p>
        {% endif %}
        {% empty %}
        	  <p>你给我的是个空 怎么for循环呢</p>
{% endfor %}

5.自定义标签函数、过滤器、inclusion_tag


	如果想自定义 必须先做以下三件事
		1.在应用下创建一个名为templatetags文件夹
		2.在该文件夹创建任意名称的py文件
		3.在该py文件内编写自定义相关代码
			from django.template import Library
			register = Library()


# 自定义过滤器
    @register.filter(name='myfilter')
    def my_add(a, b):
        return a + b

    # 自定义标签函数
    @register.simple_tag(name='mt')
    def func(a, b, c, d):
        return a + b + c + d

    # 自定义inclusion_tag
    @register.inclusion_tag(filename='it.html')
    def index(n):
        html = []
        for i in range(n):
            html.append('第%s页'%i)
        return locals()

    {% load mytag %}
    {{ i|myfilter:1 }}
    {% mt 1 2 3 4 %}
    {% index 10 %}

6.模板的继承
	{% extends 'html文件名' %}
   	{% block 名字 %}
    	模板内容
	{% endblock %}
   	{% block 名字 %}
    	子板内容
    {% endblock %}
 	一般情况下母板中至少应该有三个区域使得扩展性更高!!!
    	css content js
    {% block css %}
	{% endblock %}
    {% block content %}
	{% endblock %}
    {% block js %}
	{% endblock %}
#子板中还可以使用母板的内容  {{ block.super }} 

7.模板的导入(了解)
	将html页面的某个部分当做模块的形式导入使用
    	{% include 'menu.html' %}
posted @ 2022-09-03 14:10  懒羊羊A  阅读(148)  评论(0)    收藏  举报