目录

1.dispatch

2.模板渲染

3.过滤器

4.标签

5.组件

6.静态文件配置

dispatch

回顾:CBV对应的URL传参

urls.py

  1. url(r'^book/(\d+)/(\d+)/', views.Book.as_view()),

views.py

  1. from django.shortcuts import render, HttpResponse
  2. from django.views import View
  3.  
  4. class Book(View):
  5. def get(self,request, year, month):
  6. return HttpResponse(year+ month + '书籍')
  7.  
  8. def post(self,request,year, month):
  9. pass

CBV的实质中提到了dispatch方法

  Django的url是将一个请求分配给可调用的function的,而不是一个class。

  针对这个问题,class-based view提供了一个as_view()静态方法(也就是类方法)

  调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法

  dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() ,post() 等)

dispatch在底层是如何实现的 ?

  1. '''重点: 反射,将请求方法分发到同名的类方法去处理'''
  2. def dispatch(self, request, *args, **kwargs):
  3. if request.method.lower() in self.http_method_names:
  4. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  5. else:
  6. handler = self.http_method_not_allowed
  7. return handler(request, *args, **kwargs)

可以拓展dispatch方法

在请求方法分发给对应的类方法执行前后,做一些事情

  1. from django.shortcuts import render, HttpResponse
  2. from django.views import View
  3.  
  4. class Book(View):
  5. def dispatch(self, request, *args, **kwargs):
  6. print('dispatch front')
  7. ret = super().dispatch( request, *args, **kwargs) # 继承父类dispatch的所有内容
  8. print('dispatch behind')
  9. return ret
  10.  
  11. def get(self,request, year, month):
  12. print('get method')
  13. return HttpResponse(year+ month + '书籍')
  14.  
  15. def post(self,request,year, month):
  16. pass
  17.  
  18. '''执行结果'''
  19. dispatch
  20. get方法
  21. dispatch

模板渲染

views.py

  1. from django.shortcuts import render
  2.  
  3. def home(request):
  4. username = 'SByaya' # 可以传字符串
  5. num = 10 # 可以传数字
  6. lst1 = [11,22,33] # 可以传列表
  7. dict1 = {'k1':'v1','k2':'v2'} # 可以传字典
  8. class A:
  9. def __init__(self):
  10. self.name = 'yayasillydog'
  11. def get_name(self):
  12. return self.name + '太蠢了'
  13. a = A() # 可以传类对象
  14.  
  15. dic = {
  16. 'username':username,
  17. 'num':num,
  18. 'lst1':lst1,
  19. 'dict1':dict1,
  20. 'a':a,
  21.  
  22. }
  23.  
  24. return render(request,'home.html',dic)

home.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7.  
  8. <h1>Welcome to dog's home!!</h1>
  9. <h1>{{ username }}</h1>
  10. <h1>{{ num }}</h1>
  11. <h1>{{ lst1 }}</h1>
  12. <h1>{{ lst1.1 }}</h1> <!-- 用点索引来取值 -->
  13. <h1>{{ dict1 }}</h1>
  14. <h1>{{ dict1.k1 }}</h1> <!-- 字典.键来取值 -->
  15. <h1>{{ a.name }}</h1> <!-- 可以获取对象里的属性 -->
  16. <h1>{{ a.get_name }}</h1> <!-- 只能获取对象里的无参方法,不能够获取有参方法 -->
  17.  
  18. </body>
  19. </html>

过滤器

过滤器语法

语法:{{ value|filter_name:参数 }}

注意点:管道符两边不能有空格,有参数的冒号加参数,无参数的不需要冒号

常见的过滤器

1.default默认值

如果一个变量没有传值或者值为空,使用给定的默认值。 否则,使用变量的值。

没有传值

  1. '''没有传值'''
  2. def home(request):
  3. username = 'yayapig' # 可以传字符串
  4. dic = {
  5. # 'username':username, # 没有传username
  6. }
  7.  
  8. return render(request,'home.html',dic)

值为空

  1. '''值为空'''
  2. username = ''

default默认值语法

  1. <p>
  2. {{ username|default:'Libolun' }}
  3. </p

2.length 判断长度

  1. <p>
  2. {{ username|length }}
  3. </p>

3.filesizeformat 展示为可读的大小,自动计算单位

  1. <p>
  2. {{ file_size|filesizeformat }}
  3. </p>

4.slice 切片

  1. <p>
  2. {{ msg|slice:'0:4' }}
  3. </p>

5.date 日期格式化

  1. <p>
  2. {{ current_time|date:"Y-m-d H:i:s" }} <!-- 注意分钟是用i来表示 -->
  3. </p>

6.safe 将标签字符串识别为一个标签效果

使用safe的目的:防止xss攻击(跨站脚本攻击)

views.py

  1. def test(requqest):
  2. a_tag = '<a href="">某宝</a>'
  3. return render(request,'test.html',{'a_tag':a_tag})

test.html

  1. <p>
  2. {{ a_tag|safe }}
  3. </p>

7.truncatechars 字符截断

注意:7包括4个字符加3个省略号

  1. <p>
  2. {{ msg|truncatechars:7 }}
  3. </p>

8.truncatewords 单词截断

  1. <p>
  2. {{ msg|truncatewords:2 }}
  3. </p>

9.cut 移除value中所有的与给出的变量相同的字符串

  1. <p>
  2. {{ msg|cut:' ' }} <!-- 去除value中所有的空格 -->
  3. </p>

10.join 字符串拼接

  1. <p>
  2. {{ list1|join:'+' }} <!-- 等同于python中的"+".join(list1) -->
  3. </p>

标签

标签语法

语法: {% 标签逻辑 %}

for循环标签

1.循环列表

  1. <ul>
  2. {% for i in lst1 %}
  3. <li>{{ i }}</li>
  4. {% empty %}
  5. <span>哥,啥也木有啊</span>
  6. {% endfor %}
  7. </ul>
  8. <!-- 如果lst1为空,或者后台没有给lst1数据,那么就展示empty下面的内容 -->

2.循环字典

  1. <ul>
  2. {% for k,v in dic1.items %}
  3. <li>{{ k }}--->{{ v }}</li>
  4. {% endfor %}
  5. </ul>
  6. <!-- 在循环中,可以接dic1.keys values items -->

3.循环嵌套

  1. <ul>
  2. {% for i in lst1 %}
  3. <li>{{ i }}--->{{ forloop.counter }}</li>
  4. {% if forloop.last %}
  5. {% for ii in i %}
  6. <li>{{ ii }}--->{{ forloop.counter }}--->{{ forloop.parentloop.counter }}</li>
  7. {% endfor %}
  8. {% endif %}
  9. {% endfor %}
  10. </ul>

forloop用法

  1. forloop.counter # 当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
  2. forloop.counter0 # 当前循环的索引值(从0开始)
  3.  
  4. forloop.revcounter # 当前循环的倒序索引值(从1开始)
  5. forloop.revcounter0 # 当前循环的倒序索引值(从0开始)
  6.  
  7. forloop.first # 当前循环是不是第一次循环(布尔值)
  8. forloop.last # 当前循环是不是最后一次循环(布尔值)
  9.  
  10. forloop.parentloop # 本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等

if循环标签

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,注意条件两边都有空格。

views.py

  1. from django.shortcuts import render
  2.  
  3. def home(request):
  4. number = 102
  5.  
  6. dic = {
  7. 'number':number,
  8. }
  9.  
  10. return render(request,'home.html',dic)

home.html

  1. {% if number == 100 %}
  2. <h1>猜对了</h1>
  3. {% elif number == 101 %}
  4. <h1>101不对呀</h1>
  5. {% else %}
  6. <h1>这更不对了</h1>
  7.  
  8. {% endif %}

if语句也可以和过滤配合使用

  1. {% if user_list|length > 5 %} <!--结合过滤器来使用-->
  2. 可以可以
  3. {% else %}
  4. 不行不行
  5. {% endif %}

组件

组件:把完整的一套功能封装成模块

在前端中,就是把一套完整的样式封装起来,供其他人使用

在其他的html文件中引入一个html文件

在index.html中如果我们想使用已经封装好的zujian.html,该怎么引入呢?

index.html

  1. {% include 'zujian.html' %}

zujian.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8.  
  9. <h1 style="color:red;">这是导航栏</h1>
  10.  
  11. </body>
  12. </html>

静态文件配置

1.在项目根目录下创建一个文件夹,比如名称为xx

2.在setting.py中写入如下内容

  1. STATIC_URL = '/static/' #别名
  2.  
  3. STATICFILES_DIRS = [
  4. os.path.join(BASE_DIR,'jingtaiwenjian'), # 注意别忘了写逗号,第二个参数就是项目中你存放静态文件的文件夹名称
  5. ]

3.在html文件中使用别名

设置STATIC_URL的意义

别名也是一种安全机制,浏览器上通过调试台你能够看到的是别名的名字,这样别人就不能知道你静态文件夹的名字了,不然别人就能通过这个文件夹路径进行攻击。

STATIC_URL的用法

  1. <!-- 两种引入方式 -->
  2. <link rel="stylesheet" href="/static/css/test.css">
  3. <link rel="stylesheet" href="{% static 'css/test.css' %}">
  4.  
  5. <!-- 导入一张图片 -->
  6. <img src="/static/imgs/test.png" alt="">
  7.  
  8. <!-- 引入js文件 -->
  9. <script src="/static/js/xx.js"></script>

1.在项目根目录下创建一个文件夹,比如名称为xx

2.在setting.py中写入如下内容

day51:django:dispatch&模板渲染&过滤器&标签&组件&静态文件配置的更多相关文章

  1. Django简介,请求生命周期,静态文件配置

    Web框架 ​ Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  2. django之三剑客、静态文件配置、请求响应对象、数据库操作

    三剑客 from django.shortcuts import render,HttpResponse,redirect HttpResponse # 返回字符串 render(response, ...

  3. django 组件 自定义过滤器 自定义标签 静态文件配置

    组件 将一些功能标签写在一个html文件里,这个文件作为一个组件,如果那个文件需要就直接拿过来使用即可: 这是title.html文件,写了一个导航栏,作为一个公用的组件 <div style= ...

  4. day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间

    day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...

  5. Django 04 模板标签(if、for、url、with、autoeacape、模板继承于引用、静态文件加载)

    Django 04 模板标签(if.for.url.with.autoeacape.模板继承于引用.静态文件加载) 一.if.for.url.with.autoescape urlpatterns = ...

  6. Django框架----模板继承和静态文件配置

    母板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  7. Django(五)框架之模板继承和静态文件配置

    https://www.cnblogs.com/haiyan123/p/7731959.html 一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% end ...

  8. Django框架之模板继承和静态文件配置

    一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...

  9. Django框架之模板基础,静态文件配置

    一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...

随机推荐

  1. 根据pid获得路径 2006-10-25 19:28

    这是编写kill process时用到的 BOOL GetProcessModule(DWORD dwPID, DWORD dwModuleID, LPMODULEENTRY32 lpMe32, DW ...

  2. 通过CMD远程操作Linux系统

    一.文件传输 方法:使用sftp连接方式,sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性 命令: //登入:sftp username@ip sftp ...

  3. Vue3 + Element ui 后台管理系统

    Vue3 + Element ui  后台管理系统 概述:这是一个用vue3.0和element搭建的后台管理系统界面. 项目git地址: https://github.com/whiskyma/vu ...

  4. myBatis源码解析-配置文件解析(6)

    前言 本来打算此次写一篇关于SqlSession的解析,但发现SqlSession涉及的知识太多.所以先结合mybatis配置文件(我们项目中常写的如mybatisConfig.xml),来分析下my ...

  5. Linux系统中有趣的命令(可以玩小游戏)

    Linux系统中有趣的命令(可以玩小游戏) 前言 最近,我在看一些关于Linux系统的内容,这里面的内容是真的越学越枯燥,果然学习的过程还是不容易的.记得前几个月初学Linux时,有时候就会碰到小彩蛋 ...

  6. HM16.0之帧间Merge模式——xCheckRDCostMerge2Nx2N

    参考:https://blog.csdn.net/nb_vol_1/article/details/51163625 1.源代码: /** check RD costs for a CU block ...

  7. 【python系统学习17】python中的文件读写

    python中的文件读写 文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本.音频片段.Excel文档.邮件以及任何保存在电脑上的东西. 可使用python批量的操作本地文件, ...

  8. 使用log4j将数据流入flume

    最近做了一个log抽取的项目,采用log4j+flume实现,在此分享记录一下. 准备 什么是flume? flume是一个提供高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统. flume ...

  9. Windows servers 2008 环境下,CA证书服务器搭建。

    CA证书这个东西好像是很久之前的东西了,现在已经不大用了,不过还是作为一种服务,搭建一下. 环境:Windows servers 2008 (虚拟机环境) 1.配置IP地址. 2.添加角色. 选择Ac ...

  10. 这个爬虫JS逆向加密任务,你还不来试试?逆向入门级,适合一定爬虫基础的人

    友情提示:在博客园更新比较慢,有兴趣的关注知识图谱与大数据公众号吧.这次选择苏宁易购登录密码加密,如能调试出来代表你具备了一定的JS逆向能力,初学者建议跟着内容调试一波,尽量独自将JS代码抠出来,实在 ...