Django——模板

模板:django对模板文件没有特别大的限制 , html , txt ,没有类型的文件。

django提供一种动态生成html页面的快捷方式 , 也就是模板。模板语言(DTL)

1、配置模板

pycharm创建django项目会自动将我们的模板templates配置好。

# django 的默认模板引擎; django也支持并且内置了
# django.template.backends.jinja2.Jinja2
'BACKEND': 'django.template.backends.django.DjangoTemplates',
DIRS : 模板引擎的路径
# 设置模板引擎是否可以进入到应用中查找设置的模板
'APP_DIRS': True,
OPTIONS: 上下文处理器。

2、模板语言

DTL:模板语言,变量 , 注释 , 过滤器 , 标签 , 模板继承……

1、变量

DTL使用{{ name }}格式来表示变量 , 也可以调用函数 , 这个函数必须是嵌套在视图函数内的。

将类传递到html中

def var(request):
    name = '阿宸'
    age = 26
    gender = '男'
    name = '张迦博'
    # 模板接收的是函数的数据 , 所有函数在定义时需要有返回值
    # 函数在传递到html中会被自动的调用
    # 传递到html中函数不能有参数
    def func():
         return '你好'

    ls = [123,456,789]
    dic = {'name':'阿宸', 'age':26 , 'tel':1784168}

    class My:
        def func(self):
            return '下班吃饭去'

        @classmethod
        def get_cls(cls):
            return '等下吃烧烤'

        @staticmethod
        def get_static():
            return '走着'

    obj = My()

    return render(request , 'var.html' , locals())
<p>变量</p>
{{ name }}
{{ age }}
{{ gender }}
<p>读取视图中的函数</p>
{{ func }}<br>
{{ ls }}
<p>使用索引获取序列中的数据</p>
{{ ls.1 }}  {# 获取列表中下标为1的数据 #}
<p>格式:变量名.下标</p>
{{ dic.name }}
{{ dic.tel }}
<p>html接收类参数</p>
{{ My }}<br>
{{ obj }}
<p>调用类中的方法</p>
{{ obj.get_cls }}
{{ obj.get_static }}
{{ obj.func }}
<p>类名调用</p>
{{ My.func }}
{{ My.get_cls }}
{{ My.get_static }}

2、过滤器

过滤器可以用来显示变量的一些信息,而不显示变量的具体数据

格式:{{ 变量名|过滤器名称:数据 }}

<p>使用default过滤器</p>
<p>当变量的值为空或者false的时候返回后面的数据</p>
{{ name|default:'萘唐' }}<br>
<p>使用length过滤器</p>
<p>返回数据长度</p>
{{ ls|length }}
{{ name|length }}
<p>使用slice</p>
<p>字符串切片</p>
{{ name|slice:1 }}
<p>random过滤器</p>
<p>在指定的列表中随机获取数据</p>
{{ ls|random }}
<p>safe过滤器</p>
<p>可以将是html标签的字符串变量进行转换格式</p>
{{ html }}
{{ html|safe }}
{{ name|safe }}

自定义过滤器

在应用下创建templatetags

在这个文件夹下创建一个py文件

导入
from django import template
register = template.Library()
from django import template

register = template.Library()

# 自定义过滤器
# 过滤器最多只能接收两个参数
# 使用语法糖 @register.filter
# name 是定义过滤器的名称
@register.filter(name='num')
def my_num(num_1 , num_2):
    return num_1 * num_2
<p>使用自定义过滤器</p>
{# 导入过滤器模块 #}
{% load mytag %}
{{ ls.1|num:300 }}

3、include标签

可以实现继承的模式。多个页面中有多个重复的内容 , 可以将这一部分单独设置一个html文件 , 使用include标签来进行继承操作。

<p>使用now标签获取到格式化时间</p>
{% now "Y年m月d日 H时i分s秒" %}
<p>导入固定模板的html页面内容</p>
{# include 模板文件名 #}
{#  方式二:在导入模板的时候使用with导入参数 #}
{% include 'set.html' with name='阿宸一号' %}
<body>
<p>作者:{{ name }}</p>
<p>联系地址:广州天河</p>
<p>联系电话:1784168</p>
</body>
def text(request):
    # 方式一:在视图函数中传入数据  {'name':'阿宸'}
    return render(request , 'time.html')

4、流程控制

for循环

{% for 变量名 in 迭代对象 %}
……
{% endfor %}

if判断

{% if 判断条件 %}
……
{% elif 判断条件 %}
……
{% else %}
{% endif %}
{{ dic }}
<ul>
    {% for key , value in dic.items %}
        <li>{{ key }} = {{ value }}</li>
    {% endfor %}
</ul>
<p>数学成绩为:{{ dic.math }}</p>
{% if dic.math >= 110 %}
    等级:A
{% elif dic.math >= 90 %}
    等级:B
{% elif dic.math >= 70 %}
    等级:C
{% elif dic.math >= 60 %}
    等级:D
{% else %}
    等级:不合格
{% endif %}

3、模板继承

子模板通过继承获取父模板的内容 ,并且可以在子模板中覆盖父模板的内容。

父模板用{% block 名称%} 和{% endblock 名称%} 标签所涵盖的内容,子模板可以继承使用并且可以进行重新编写。

子模板继承用{% extends "父模板文件名"%}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <link rel="stylesheet"   href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/js/jquery-3.6.0.min.js"></script>
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>

    <ul class="nav nav-tabs">
      <li role="presentation" class="active"><a href={% url 'ind' %}>首页</a></li>
      <li role="presentation"><a href={% url 'r' %}>注册</a></li>
      <li role="presentation"><a href={% url 'lon' %}>登录</a></li>
    </ul>

    {% block head %}
    <div class="panel panel-default">
      <div class="panel-heading">首页</div>
      <div class="panel-body">
        欢迎光临
      </div>
    </div>
    {% endblock head %}
    
    {% block name %}

    {% endblock name %}
</body>
</html>
{% extends 'index.html' %}

{% block head %}
    <div class="panel panel-default">
      <div class="panel-heading">登录</div>
      <div class="panel-body">
        <form>
            <input type="text" name="name">
            <input type="password" name="password">
            <input type="submit" value="登录">
        </form>
      </div>
    </div>
{% endblock head %}

{% block name %}
<h1>今天的内容我们就讲到这里啦</h1>
{% endblock name %}