django的模板系统

前言

来看一段代码

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意;

原因:

  1. 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改,牵一发而动全身;

  2. Python 代码编写和 HTML 设计是两项不同的工作,前端开发和后端开发无非 并行;

基于这些原因,将HTML页面的设计和后端逻辑设计分离,会更简洁、容易维护开发我们的WEB应用。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。

模板是什么?

Django自带的模板语言= HTML代码+逻辑控制代码,注意 模板 != HTML,模块 =HTML代码+逻辑控制代码(特殊标记);

模板作用?

在server端 把后端的变量 嵌入到HTML中渲染后,返回给浏览器来达到前后端代码分离,页面动态显示的目的;

一、初探模板

1、模板路径设置
  1. 首先在项目根目录下创建一个名为 templates 的文件夹,然后根据创建的APP以其名称创建对应的模板文件夹,这里创建了一个 teacher 的APP。
  2. 在项目目录下的settings.py模块中的 TEMPALTES 列表中的字典中key为DIRS 的value列表中添加上一步的创建的文件夹的路径,添加格式如下:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],   # 在这一行添加 BASE_DIR为项目根目录路径
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
2、渲染
  1. 方式一
from django.shortcuts import render 
from django.http import HttpResponse
from django.template.loader import get_template

def index(request):
    tmp = get_template('teacher/index.html')
    html = tmp.render()
    return HttpResponse(html)
  1. 方式二
from django.shortcuts import render

def index(request):
    return render(request, 'teacher/index.html')

二、模板路径查找

1、查找顺序
  1. 首先在项目目录下的settings.py模块中的 TEMPALTES 列表中的字典中key为DIRS 的value列表中去依次查找模板路径。
  2. 其次,当 TEMPALTES 列表的字典中key为 APP_DIRS 的value值为 True 时,会去在settings.py模块下的 INSTALLED_APPS 列表中查找已经注册的APP。然后根据这已经注册的APP在APP目录下的模板文件下查找。
2、两种方案

根据上述模板路径的查找顺序,可以有以下两种方案存放模板路径

  1. 在一般情况下,模板文件存放在项目根目录下的 templates 文件夹下各APP所对应的的文件夹下,方便统一管理与维护。
  2. 当一个APP进行复用时,此时需要将此APP的模板文件存放在此APP目录下的模板文件下。、

为什么要在项目根目录下的 templates 文件夹下还要以各APP的名字创建文件夹??
因为当 templates 文件夹下存在与项目APP目录下同名的模板文件的情况下,在查找时会产生冲突。

三、模板变量

1、静态页面与动态页面 CSDN解释
2、模板变量
  • 语法
  • 不能与下划线开头
  • 变量的值可以是任何数据类型
3、变量的解析规则
  • 计算变量,将其替换为结果
  • 遇到点(.)的时候按以下顺序查找:
    1. 字典键值查找
    2. 属性或方法查找
    3. 数字索引查找
  • 如果结果是可调用的,则调用它时不带参数,调用的结果成为模板的值(所谓结果是可调用的,说明变量是高函数或者方法)
    渲染失败时返回空字符串(’’)

四、模板过滤器(filter)

常用模板过滤器

  • add 将参数与值相加 首先尝试转换成整数相加,失败,则尝试所有可能,字符串,列表等。{{ value|add:“2” }}
  • capfirst 首字母大写,如果第一个字母不是字母则不起作用。{{ value|capfirst }}
  • date 日期格式化 {{ value|date:“D d M Y” }}
  • time 时间格式化 {{ value|time:“H:i” }} 格式化格式见官方文档:https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#date
  • default 如果变量解析失败,使用给定的默认值。{{ value|default:“nothing” }}(注意如果value是’‘空字符串,输出将会是’nothing’)
  • first 返回列表的第一个元素 {{ value|first }}
  • last 返回列表的最有一个元素 {{ value|last }}
  • slice 返回一个列表的切片 {{ some_list|slice:":2" }}
  • join 连接字符串列表 与str.join(list)一样 {{ value|join:" // " }}
  • floatformat 浮点数格式化 不指定小数位参数,默认保留一个为小数
valueTemplateOutput
34.23234{{ value|floatformat }}34.2
34.23234{{ value|floatformat:3 }}34.232
  • length 返回字符串或列表的长度
  • length_is 判断字符串或列表长度是否指定的值,相等返回True {{ value|length_is:“4” }}
  • lower 字符串中的字母都变小写{{ value|lower }}
  • upper 字符串中的字母都变大写{{ value|upper }}
  • safe 关闭变量的自动转义,使html标签生效{{ value|safe }}
  • title 标题化,首字母大写 {{ value|title }}

*xss(跨域脚本攻击) 百度百科

五、静态文件的引入

静态文件包括css、js以及图片

  1. 路径配置——在项目目录下的settings.py模块中配置一下两个变量
    1. STATICFILES_DIRS
    2. STATIC_URL(默认已经创建,在模块的最后面,默认值为’/static/’)
    首先在项目根目录下创建如下图的static目录
    在这里插入图片描述
    然后在settings.py中将 STATICFILES_DIRS 与 STATIC_URL 赋值如下
STATIC_URL = '/static/'
STATICFILES_DIRS  = [os.path.join(BASE_DIR, 'static')]    # 同模板路径设置一样
  1. 文件引入
    1. 硬编码(通过 STATIC_URL )(不推荐)
    <link rel="stylesheet" href="/static/teacher/css/index.css">
    2. 模板标签
    <link rel="stylesheet" href="{% static 'teacher/css/index.css' %}">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值