django(模版层)

发布时间 2023-07-31 16:06:39作者: coder雪山

一 模板语法传值

{{}}: 变量相关、过滤器

{%%}: 逻辑相关(静态文件配置、反向解析、标签相关、模版继承和 导入)

def index(request):
    # 模板语法可以传递的后端python数据类型
    n = 123
    f = 1.23
    s = '我不想值班'
    b = True
    l = ['lq', 'zd', 'xiaobao', '陈禹']
    t = (11, 22, 33, 44)
    d = {'username': 'lq', 'age': 18}
    se = {'lr', '洋洋', 'cys'}

    def func():  # 传递函数名会自动加括号调用,当是模板语法不支持给函数传额外的参数
        print('我被执行了')
        return '哈哈,今天不值班'

    class Myclass():  # 传类名的时候也会自动加括号调用(实例化)
        def get_self(self):
            return 'self'

        @staticmethod
        def get_func():
            return 'func'

        @classmethod
        def get_class(cls):
            return 'cls'

    obj = Myclass()

    # return render(request,'index.html',{})  # 一个个传
    return render(request, 'index.html', locals())

<p>{{ n }}</p>
<p>{{ f }}</p>
<p>{{ s }}</p>
<p>{{ b }}</p>
<p>{{ l }}</p>
<p>{{ d }}</p>
<p>{{ t }}</p>
<p>{{ se }}</p>
<p>{{ func }}</p>
<p>会加括号,进行实例化{{ Myclass }}</p>
<p>{{ obj }}</p>
<p>内部能够自动判断出当前的变量名是否可以加括号调用,如果可以就会自动执行,针对的是函数名和类名</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_func }}</p>
<p>{{ obj.get_class }}</p>

# django模板语法的取值,是固定的格式,只能采用“句点符”
<p>字典的取值{{ d.username }}</p>
<p>列表的索引{{ l.0 }}</p>
# 既可以点键也可以点索引,还可以两者混用

二 模板语法之过滤器

# 过滤器就类似于是模板语法内置的 内置方法
# django内置有60多个过滤器,了解10个左右差不多,
# 基本语法
{{数据|过滤器:参数}}

# 转义
1、前端
|safe
2、后端
    from django.utils.safestring import mark_safe
    res=mark_safe('<h1>陈愈泽</h1>')
'''
在写全栈项目的时候,前端代码不一定非要在前端页面书写
也可以在后端写好,然后传递给前端页面
'''

# 视图函数
def index(request):
    # 模板语法可以传递的后端python数据类型
    n = 123
    f = 1.23
    s = '我不想值班'
    b = True
    l = ['lq', 'zd', 'xiaobao', '陈禹泽', '']
    t = (11, 22, 33, 44)
    d = {'username': 'lq', 'age': 18, 'hobby': 'football'}
    se = {'lr', '洋洋', 'cys'}

    def func():  # 传递函数名会自动加括号调用,当是模板语法不支持给函数传额外的参数
        print('我被执行了')
        return '哈哈,今天不值班'

    class Myclass():  # 传类名的时候也会自动加括号调用(实例化)
        def get_self(self):
            return 'self'

        @staticmethod
        def get_func():
            return 'func'

        @classmethod
        def get_class(cls):
            return 'cls'

    obj = Myclass()

    file_size = 123123123
    import datetime
    current_time = datetime.datetime.now()

    info = '我不想值班我不想值班我不想值班我不想值班我不想值班我不想值班我不想值班我不想值班我不想值班我不想值班'
    egl = 'my name is lq my age is 18 my hobby is read'
    msg = 'I love football I belive china'
    hhh = '<h>小宝</h1>'
    from django.utils.safestring import mark_safe
    res = mark_safe('<h1>陈愈</h1>')
    # return render(request,'index.html',{})  # 一个个传
    return render(request, 'index.html', locals())

# 前端代码
<h1>过滤器</h1>
<p>统计长度:{{ s|length }}</p>
<p>默认值(第一个参数布尔值是True就展示第一个参数的值是否在展示冒号后面的值):{{ b|default }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>日期大小:{{ current_time|date:'Y-m-d H:i:s' }}</p>
<p>切片操作(支持步长):{{ l|slice:'0:4:2' }}</p>
<p>切取字符(从info字符串中截取9个字符串,包含三个点):{{ info|truncatechars:9 }}</p>
<p>切取单词(不包括三个点 按照空格切):{{ egl|truncatewords:9 }}</p>
<p>切取单词(不包括三个点 按照空格切):{{ info|truncatewords:9 }}</p>
<p>移除特定的字符:{{ msg|cut:' ' }}</p>
<p>拼接操作:{{ l|join:'$' }}</p>
<p>拼接操作(加法):{{ n|add:10 }}</p>
<p>拼接操作(加法):{{ s|add:msg }}</p>
<p>默认前端标签不转义{{ res }}</p>
<p>需要前端标签转义{{ res|safe }}</p>

三 模板语法之标签

# for循环
{% for foo in l %}  <!-- for i in l-->
{#    <p>{{ forloop }}</p> forloop是模版语法自带的一个变量,跟if结合使用
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 5, 'revcounter0': 4, 'first': True, 'last': False}#}
    <p>{{ foo }}</p>
{% endfor %}

# if判断
{% if b %}
<p>不想值班</p>
{% elif s%}
    <p>我真的不值班</p>
{% else %}
    <p>是真的</p>
{% endif %} 

# for与if混合使用
{% for foo in l %}
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last %}
        <p>这是我的最后一次</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}
        <p>for循环的可迭代对象内部没有元素,根本没法循环</p>
{% endfor %}

# 字典的for循环使用
{% for foo in d.keys %}
    <p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %}
    <p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %}
    <p>{{ foo }}</p>
{% endfor %}

# with起别名
{% with d.username as nb %}
    <p>{{ nb }}</p>
{% endwith %}
# 在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式

四 自定义过滤器、标签

'''
三步走
    1、在应用下创建一个名字必须叫templatetags文件夹
    2、在该文件夹内创建任意名称的py文件  eg:mytag.py
    3、在该py文件内必须先书写下面两句话
'''
mytags.py
from django import template register=template.Library() # 自定义过滤器 @register.filter(name='xiaobao') def my_sum(v1, v2): return v1 + v2 # 使用 {% load mytags %} }} <p>{{ n|xiaobao:100 }}</p> # 自定义标签(参数可以有多个) 类似于自定义函数 @register.simple_tag(name='lq') def index(a, b, c, d): return '{}-{}-{}-{}'.format(a, b, c, d) # 使用 {% load mytags %} # 标签多个参数彼此之间空格隔开 <p>{% lq 'zd' 12 12 12 %}</p>

五 自定义inclusion_tag

'''
内部原理
    先定义一个方法
    在页面上调用该方法,并且可以传值
    该方法会生成一些数据然后传递给一个html页面
    之后将渲染好的结果放到调用的位置
'''
@register.inclusion_tag('left_menu.html')
def left(n):
    data = ['第{}项'.format(i) for i in range(n)]
    # 第一种
    # return {'data':data}
    # 第二种
    return locals()  # 将data传递给left_menu.html
 
# 把left_menu.html传递给index.html中的一个局部
{% load mytags %}
{% left 10 %}

'''
总结:当html页面某一个地方的页面需要传参数才能动态的渲染出来,并且在多个页面上都需要使用到该局部,那么就考虑将该局部页面做成inclusion_tag形式
(在讲bbs的时候会使用到) 
'''

六 模板的继承

'''
有些网站页面整体都差不多,只是某一些局部在做变化
'''
# 模板得继承,自己先选好一个想要继承得区域
{% extends 'home.html' %}

# 继承之后子页面跟模板页面长的是一模一样的,需要在模板页面上提前划定可以修改的区域
{% block content %}
    模板内容
{% endblock %}

# 子页面就可以声明想要修改那块划定了的区域
{% block content %}
    子页面内容
{% endblock %}

'''
一般情况下模版页面上应该至少有三块可以被修改的区域
1、css区域
2、html区域
3、js区域
'''


模板页面
{% block css %}

{% endblock %}        

{% block js %}

{% endblock %}

子页面
{% block css %}
<style>
    h1{
        color: red;
    }
</style>
{% endblock %}

{% block js %}
<script>
alert('登录页面')
</script>
{% endblock %}

'''
一般情况下,模版的页面上划定的区域越多,那么该模版的扩展性就越高
但是如果太多,还不如自己直接写
'''

七 模版的导入

'''
将页面的某一个局部当成模块的形式
那个地方需要就可以直接导入使用即可
'''

{% block content %}
    <h1 class="text-center">登录页面</h1>
    <form action="">
        <P>username: <input type="text" class="form-control"></P>
        <P>password: <input type="text" class="form-control"></P>
        <input type="submit" class="btn btn-success">
    </form>
    {# 模版导入 #}
    {% include 'modul import.html' %}
{% endblock %}