当前位置: 首页 > news >正文

开发工程师必备————【Day26】Django补充(三)

今日内容详细

  • 网页伪静态
  • 视图层
  • 模板层

网页伪静态

将动态网页伪装成静态网页 从而提升网页被搜索引擎收录的概率
表现形式就是网址看着想一个具体的文件路径

path(‘index.html’,view.index)

视图层

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格式数据
user_dict = {‘name’: ‘jason老师’, ‘pwd’: 123, ‘hobby’: [‘read’, ‘run’, ‘music’]}
json_str = json.dumps(user_dict, ensure_ascii=False)
return HttpResponse(json_str)
return JsonResponse(user_dict)

from django.http import JsonResponse
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)
JsonResponse(user_dict, json_dumps_params={‘ensure_ascii’:False})
序列化非字典类型的数据还需要指定safe参数为False

3.form表单携带文件数据
form表单需要具备的条件
1.method属性值必须是post
2.enctype属性值必须是multipart/form-data
后端获取文件数据的操作
request.FILES

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,‘modal.html’,locals())

2.模板语法传值的范围
基本数据类型直接传递使用
函数名的传递会自动加括号执行并将返回值展示到页面上
注意函数如果有参数则不会执行也不会展示 模板语法不支持有参函数
类名的传递也会自动加括号产生对象并展示到页面上
对象的传递则直接使用即可
ps:模板语法会判断每一个名字是否可调用 如果可以则调用!!!
“”“django的模板语法在操作容器类型的时候只允许使用句点符”“”

3.模板语法过滤器(类似于python内置函数)

统计长度:{{ s|length }}


加法运算:{{ i|add:123 }}、加法运算:{{ s|add:‘heiheihei’ }}


日期转换:{{ s|date:‘Y-m-d H:i:s’ }}


文件大小:{{ file_size|filesizeformat }}


数据切片:{{ l|slice:‘0:10’ }}


字符截取(三个点算一个):{{ s1|truncatechars:6 }}


单词截取(空格):{{ s1|truncatewords:6 }}


语法转义:{{ script_tag|safe }}


语法转义:{{ script_tag1|safe }}


from django.utils.safestring import mark_safe
script_tag1 = ‘’
res = mark_safe(script_tag1)
ps:有时候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’ %}

相关文章:

  • 秒杀系统(1)——秒杀功能设计理念
  • [数据结构]~栈和队列(0-1)
  • 猿创征文|十 BLE协议之L2CAP
  • tomcat的初期了解
  • 羊城杯2022 部分web
  • 音视频图像篇 YUV-RGB
  • 【Python 实战基础】Pandas如何从字符串中解析某一数据,并统计多于一次的该数据
  • Bus:消息总线
  • SpringBoot - 用maven-dependency-plugin插件将项目代码与依赖分开打包
  • 一文学会如何使用适配器模式
  • 计算机网络原理 谢希仁(第8版)第四章习题答案
  • Linux入门第三天——linux命令(二)
  • 为什么要在单片机程序中使用结构体和指针
  • ROS1云课→19仿真turtlebot(stage)
  • VL1_四选一多路器(完整RTL、Testbench和覆盖率)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [数据结构]链表的实现在PHP中
  • Android优雅地处理按钮重复点击
  • Angular Elements 及其运作原理
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Debian下无root权限使用Python访问Oracle
  • Git的一些常用操作
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java读取Properties文件的六种方法
  • Java小白进阶笔记(3)-初级面向对象
  • leetcode386. Lexicographical Numbers
  • vue-router 实现分析
  • Vue实战(四)登录/注册页的实现
  • webgl (原生)基础入门指南【一】
  • 分布式任务队列Celery
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 浅谈Golang中select的用法
  • 线性表及其算法(java实现)
  • No resource identifier found for attribute,RxJava之zip操作符
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ###项目技术发展史
  • #define与typedef区别
  • #pragam once 和 #ifndef 预编译头
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (利用IDEA+Maven)定制属于自己的jar包
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • ./和../以及/和~之间的区别
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 的程序集加载上下文
  • .net 提取注释生成API文档 帮助文档
  • .Net 知识杂记
  • .Net 中Partitioner static与dynamic的性能对比