第四十七篇 Django模板DTL-Django Templates Language

心得:不知道为什么,学习好有意思呀,越来越感兴趣了。今晚写完模板所有内容,明天去重点学习数据库交互内容,加油加油~

DTL与普通的HTML文件的区别:

DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进 去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。

渲染模板:

将模板渲染成字 符串和包装成 HttpResponse 对象

from django.shortcuts import render,HttpResponse,reverse

def index(request):
    context = {'name':'tian'}
    return render(request,"front/index.html",context=context)

shortcuts 快捷键的意思,此类中封装了大量我们需要的函数
HttpResponse 函数用来返回字符串给网页的
reverse 函数用来反转获得网页url的
render 函数 :渲染模板
参数一:request 不能少,必须的参数
参数二:‘front/index.html’ 模板所在路径
参数三:传递字符,必须是字典格式的

模板路径定义:

  1. 不用改setting文件,直接在app路径下创建模板路径:front/templates/front/index.html
  2. 修改setting文件,将模板文件都放入创建文件夹下:
    [os.path.join(BASE_DIR, ‘templates’)]

模板语法

传递变量

  1. 列表
def index(request):
    context = {'name':['tian','jian','hello']}
    return render(request,"front/index.html",context=context)
<p>哈喽 {{name.1}}</p>

可以用点.的方式进行索引查询,0代表列表第一个元素

  1. 元组

类似于列表

  1. 字典
def index(request):
    context = {
        'info':{
            'name':'tian',
            'age':18,
            'sex':'male',
        }
    }
    return render(request,"front/index.html",context=context)
<p>哈喽 {{info.name}}</p>

可以用点.的方式进行查找这个字典的 username 这个 key 对应的值

class Info():
    name='tian'
    age=18
    sex='male'
def index(request):
    context = {'info':Info()}
    return render(request,"front/index.html",context=context)
<p>哈喽 {{info.name}}</p>

用点.的方式是一个对象,那么就会查找这个对象的 username 属性,或者是 username 这个方法。

模板标签

  1. if 标签,可以使用 ==、!=、<、<=、>、>=、in、not in、is、is not 等判断运算符。
{% if 'tian' in info.name %}
    <p>你好</p>
{% else %}
    <p>你好帅</p>
{% endif %}
  1. for…in… 标签 可以遍历列表、元 组、字符串、字典
{% for k,v in info.items %}
    <p>key :{{ k }}</p>
    <p>values :{{ v }}</p>
{% endfor %}
  1. url 标签 在模版中,我们经常要写一些 url,使用这种反转的方式来实现,类似于 django 中的 reverse 一 样

url 反转的时候需要传递参数

path('book/<name>/',views.book,name='book_name'),
<a href="{% url 'front:book_name' name='三国演义' %}">书名</a>

使用 url 标签反转的时候要传递查询字符串的参数,那么必须要手动在在后面添 加

path('book/author/',views.author,name='author'),
<a href="{% url 'front:author' %}?author=罗贯中 ">作者</a>

注意:如果需要传递多个参数,那么通过空格的方式进行分隔,关键字之间一定要用空格分开,负责会出现莫名的错误。url字符串拼接字符串时不需要引号。

模版常用过滤器

  1. add 这个过滤器会尝试将 值 和 参数 转换成整形然后进行相 加。如果转换成整形过程中失败了,那么会将 值 和 参数 进行拼接。如果是字符串,那么会拼接 成字符串,如果是列表,那么会拼接成一个列表。
{{ info.name|add:'asd'}}

python源码:

def add(value, arg):
    """Add the arg to the value."""    
    try:        
        return int(value) + int(arg)    
    except (ValueError, TypeError):        
        try:            
            return value + arg        
        except Exception:            
            return ''
  1. 移除值中所有指定的字符串。
{{ value|cut:" " }}

python源码

def cut(value, arg):
    """Remove all values of arg from the given string."""    
    safe = isinstance(value, SafeData)    
    value = value.replace(arg, '')    
    if safe and arg != ';':        
        return mark_safe(value)    
    return value
  1. date 将一个日期按照指定的格式,格式化成字符串

Y 四位数字的年份 2018
m 两位数字的月份 01-12
d 两位数字的天 01-31
H 小时,24小时格式的,1-9前面有0前缀 01-23
i 分钟,1-9前面有0前缀 00-59
s 秒,1-9前面有0前缀 00-59

{{ info.birthday|date:'Y/m/d-H:i:s' }}

#Dec. 25, 2019, 10:02 p.m.
#2019/12/25-22:02:18
  1. default
{{ value|default:"nothing" }}

如果 value 是等于一个空的字符串。比如 “” ,那么以上代码将会输出 nothing

  1. first返回列表/元组/字符串中的第一个元素。last
  2. lower将值中所有的字符全部转换成小写。upper
  3. join类似与 Python 中的 join ,将列表/元组/字符串用指定的字符进行拼接
  4. length获取一个列表/元组/字符串/字典的长度。

引入模板

include方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>哈喽哈喽</p>
</body>
</html>
{% include 'front/base.html' %}
<p>我是main内容</p>

模板继承

base模板:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Title{% endblock title %}</title>
</head>
<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li>
                <a href="/">首页</a>
                <a href="{% url 'front:son' %}">内容</a>
            </li>
        </ul>
        {% endblock sidebar %}
    </div>
    {% block content %}{% endblock content %}
    <p>哈喽哈喽</p>
</body>
</html>

son.html

{% extends 'front/base.html' %}

{% block title %}子类的title,替换了原来的字符{% endblock title %}

{% block content %}
<p>哈哈,我可以写自己的方法</p>
{% endblock content %}

结果:
base:
在这里插入图片描述
son:
在这里插入图片描述
需要注意的是:extends标签必须放在模版的第一行。 子模板中的代码必须放在block中,否则将不会被渲染。
在定义 block 的时候,除了在 block 开始的地方定义这个 block 的名字,还可以在 block 结束 的时候定义名字。比如 {% block title %}{% endblock title %} 。

将需要重写的内容加入block进行包裹,在子类中写入新的方法需要在包裹中的block写如内容。
父类:{% block title%} 我是一个标题 {% endblock%}
子类调用:{% extends '父类.html'%} {% block title %} 我是新的标题{% endblock%}

加载静态文件

在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片 等。因此在 DTL 中加载静态文件是一个必须要解决的问题。在 DTL 中,使用 static 标签来加载 静态文件

  1. 创建文件夹和修改setting设置
    在这里插入图片描述
  2. 加载头部static
    在这里插入图片描述
    link标签为加载css文件
    img标签为加载图片
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Title{% endblock title %}</title>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li>
                <a href="/">首页</a>
                <a href="{% url 'front:son' %}">内容</a>
            </li>
        </ul>
        {% endblock sidebar %}
    </div>
    <img src="{% static 'images/tian.jpg'%}" alt="">
    {% block content %}{% endblock content %}
    <p>哈喽哈喽</p>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值