日志

day51:django:dispatch&模板渲染&过滤器&标签&组件&静态文件配置

 来源    2020-09-16    0  

目录

1.dispatch

2.模板渲染

3.过滤器

4.标签

5.组件

6.静态文件配置

dispatch

回顾:CBV对应的URL传参

urls.py

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

views.py

from django.shortcuts import render, HttpResponse
from django.views import View


class Book(View):
    def get(self,request, year, month):
        return HttpResponse(year+ month + '书籍')

    def post(self,request,year, month):
        pass

CBV的实质中提到了dispatch方法

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

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

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

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

dispatch在底层是如何实现的 ?

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

可以拓展dispatch方法

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

from django.shortcuts import render, HttpResponse
from django.views import View

class Book(View):
    def dispatch(self, request, *args, **kwargs):
        print('dispatch front')
        ret = super().dispatch( request, *args, **kwargs) # 继承父类dispatch的所有内容
        print('dispatch behind')
        return ret

    def get(self,request, year, month):
        print('get method')
        return HttpResponse(year+ month + '书籍')

    def post(self,request,year, month):
        pass
    
'''执行结果'''
dispatch前
get方法
dispatch后

模板渲染

views.py

from django.shortcuts import render

def home(request):
    username = 'SByaya' # 可以传字符串
    num = 10 # 可以传数字
    lst1 = [11,22,33] # 可以传列表
    dict1 = {'k1':'v1','k2':'v2'} # 可以传字典
    class A:
        def __init__(self):
            self.name = 'yayasillydog'
        def get_name(self):
            return self.name + '太蠢了'
    a = A() # 可以传类对象

    dic = {
        'username':username,
        'num':num,
        'lst1':lst1,
        'dict1':dict1,
        'a':a,

    }

    return render(request,'home.html',dic)

home.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
</head>
<body>

<h1>Welcome to dog's home!!</h1>
<h1>{{ username }}</h1>
<h1>{{ num }}</h1>
<h1>{{ lst1 }}</h1>
<h1>{{ lst1.1 }}</h1> <!-- 用点索引来取值 -->
<h1>{{ dict1 }}</h1>
<h1>{{ dict1.k1 }}</h1> <!-- 字典.键来取值 -->
<h1>{{ a.name }}</h1> <!-- 可以获取对象里的属性 -->
<h1>{{ a.get_name }}</h1> <!-- 只能获取对象里的无参方法,不能够获取有参方法 -->

</body>
</html>

过滤器

过滤器语法

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

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

常见的过滤器

1.default默认值

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

没有传值

'''没有传值'''
def home(request):
    username = 'yayapig' # 可以传字符串
    dic = {
        # 'username':username, # 没有传username
    }

    return render(request,'home.html',dic)

值为空

'''值为空'''
username = ''

default默认值语法

<p>
    {{ username|default:'Libolun' }}
</p

2.length 判断长度

<p>
    {{ username|length }}
</p>

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

<p>
    {{ file_size|filesizeformat }}
</p>

4.slice 切片

<p>
    {{ msg|slice:'0:4' }}
</p>

5.date 日期格式化

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

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

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

views.py

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

test.html

<p>
    {{ a_tag|safe }}
</p>

7.truncatechars 字符截断

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

<p>
    {{ msg|truncatechars:7 }}
</p>

8.truncatewords 单词截断

<p>
    {{ msg|truncatewords:2 }}
</p>

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

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

10.join 字符串拼接

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

标签

标签语法

语法: {% 标签逻辑 %}

for循环标签

1.循环列表

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

2.循环字典

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

3.循环嵌套

<ul>
    {% for i in lst1 %}
        <li>{{ i }}--->{{ forloop.counter }}</li>
        {% if forloop.last %}
            {% for ii in i %}
                <li>{{ ii }}--->{{ forloop.counter }}--->{{ forloop.parentloop.counter }}</li>
            {% endfor %}
        {% endif %}
    {% endfor %}
</ul>

forloop用法

forloop.counter            # 当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
forloop.counter0           # 当前循环的索引值(从0开始)

forloop.revcounter         # 当前循环的倒序索引值(从1开始)
forloop.revcounter0        # 当前循环的倒序索引值(从0开始)

forloop.first              # 当前循环是不是第一次循环(布尔值)
forloop.last               # 当前循环是不是最后一次循环(布尔值)

forloop.parentloop         # 本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等

if循环标签

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

views.py

from django.shortcuts import render

def home(request):
    number = 102

    dic = {
        'number':number,
    }

    return render(request,'home.html',dic)

home.html

{% if number == 100 %}
    <h1>猜对了</h1>
{% elif number == 101 %}
    <h1>101不对呀</h1>
{% else %}
    <h1>这更不对了</h1>

{% endif %}

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

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

组件

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

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

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

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

index.html

{% include 'zujian.html' %}

zujian.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1 style="color:red;">这是导航栏</h1>

</body>
</html>

静态文件配置

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

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

STATIC_URL = '/static/' #别名

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

3.在html文件中使用别名

设置STATIC_URL的意义

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

STATIC_URL的用法

<!-- 两种引入方式 -->
<link rel="stylesheet" href="/static/css/test.css">
<link rel="stylesheet" href="{% static 'css/test.css' %}">

<!-- 导入一张图片 -->
<img src="/static/imgs/test.png" alt="">

<!-- 引入js文件 -->
<script src="/static/js/xx.js"></script>
相关文章
第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册
日志第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...
1
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
日志python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...
1
python – 使用django提供没有模板渲染的html文件?
问答我有一个html文件,我通过使用Bokeh库创建可视化来生成.我想将它包含在我的django站点中,但是,当我尝试将其添加为视图时,我得到了TemplateSyntaxError.似乎页面中的某些语法 ...
1
Django初探(模板渲染、模板语音、simple_tag、母版子版、静态配置文件)
日志一.首先我们用PyCharm来创建一个Django项目 终端命令:django-admin startproject sitename 图形创建: 这样一个Django项目就创建完成了,上面可以看到项 ...
Django之模板层-自定义过滤器以及标签
日志自定义标签与过滤器 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 在app中创建templatetags模块(模块名只能是t ...
Django(五)框架之模板继承和静态文件配置
日志https://www.cnblogs.com/haiyan123/p/7731959.html 一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% end ...
1
Django框架之模板继承和静态文件配置
日志一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...
1
Django框架(二)—— 基本配置:app注册、模板配置、静态文件配置、数据库连接配置post和get
日志app注册.模板配置.静态文件配置.数据库连接配置post和get 一.app 在Django中,APP可以用以下类比 大学 --------------------项目 计算机学院--------- ...
1
Django day07 (一) 模板的导入 母板的继承 静态文件配置
日志一:模板的导入   -写一个模板 {% include '模板的名字' %} 二:母板的继承   -写一个母版(可以留多个盒子) {% block 名字 %} / {% endblock %} 三:静 ...
1
Django模板语言-(母板、组件、静态文件相关、simple_tag、inclusion_tag)
日志母板 母版的写法 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
1
Django模版中加载静态文件配置详解
日志1.settings.INSTALLED_APPS下添加:django.contrib.staticfiles 2.settings.py下添加:STATIC_URL = '/static/' 3. ...
1
django静态文件配置
日志一.django静态文件配置原理 静态文件配置就是为了让用户请求时django服务器能找到静态文件返回. 首先要理解几个概念: 媒体文件:用户上传的文件 静态文件:css,js,image等 开发环境 ...
1
Django 静态文件配置 (Nginx)
日志初学Django,在访问静态文件时候遇到很多误区,一直配置不成功,在此记录一下. Django静态文件访问分为两种:一种是Debug模式下,测试开发网站时对静态文件的访问,一种是实际生产环境中对静态文 ...
1
day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间
日志day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...
1
Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查
日志本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...
1
Django 静态文件配置
日志static Django中,静态资源的存放通过设置STATIC_URL, STATICFILES_DIRS来设置 一般STATIC_URL设置为:STATIC_URL='/static/',这个st ...
1
Django框架静态文件配置和URL解析
日志静态文件配置 1:#在django项目下创建一个static静态文件文件夹,在static文件夹下创建对应的css,img,js文件夹,用来存放css样式文件,图片和js代码,用于HTML引入 2:# ...
1
Python django 404页面配置和debug=false 静态文件配置 django版本1.10.5
日志django设置404页面 1.设置settings文件 DEBUG = False ALLOWED_HOSTS = ['127.0.0.1', 'localhost']或者 ALLOWED_HOST ...
1
Django之静态文件配置
日志在项目目录中打开settings.py,在最下面配置静态文件(css文件,js文件以及其他静态配置文件),比如说html使用到了jQuery框架,我们要在项目根目录下创建statics(可自定义),将 ...
django静态文件配置和使用
日志一.首先需要了解的知识点是: 1.出于对效率和安全的考虑,django管理静态文件的功能仅限于在开发阶段的debug模式下使用,且需要在配置文件的INSTALLED_APPS中加入django.con ...