嘘~ 正在从服务器偷取页面 . . .

DJango 学习(10)—— 模板层介绍


模板层

模板语法传值

"""
{{}}:变量相关

{% %}:逻辑相关
"""
# 后端
def test(request):
    # 模板语法可以传递的后端数据类型
    n = 123
    f = 11.11
    s = "奥特曼"
    b = True
    l = ["aoteman", "alterman"]
    t = (111, 333, 222)
    d= {"name": "tiga", "age": 18}
    se = {"呵呵", "哈哈"}

    def func():
        return "aoteman123"

    class MyClass(object):
        def get_self(self):
            return "self"

        @staticmethod
        def get_func():
            return "func"

        @classmethod
        def get_class(cls):
            return cls

    obj = MyClass()

    return render(request, "test.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>{{ obj.get_class }}</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_func }}</p>

<p>内部能够自动判断出当前的变量名是否可以加括号调用 如果可以就会自动执行  针对的是函数名和类名</p>


# django 语法的取值 是固定的格式 只能采用“句点号”
<p>{{ d.name }}</p>
<p>{{ l.0 }}</p>

模板语法过滤器(过滤器最多有两个参数)

# 类似于 模板语法 内置的内置方法
# django 内部有 60多 个内置方法

# 基本语法
{{数据|过滤器:参数}}

    <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:1' }}</p>
    <p>切去字符(包含三个点){{ info|truncatechars:9 }}</p>
    <p>切取单词(不包含三个点,按空格切取){{ eng|truncatewords:9 }}</p>
    <p>移除特定的字符:{{ eng|cut:" " }}</p>
    <p>拼接操作:{{ l|join:"$" }}</p>
    <p>拼接操作(加法):{{ n|add:10 }}</p>

# 取消转义
    # 前端
    <p>{{ hhh }}</p>
    <p>取消转义:{{ hhh|safe }}</p>
    
    # 后端
    from django.utils.safestring import mark_safe
    res = mark_safe("<h1>123</h1>")
    <p>{{ res }}</p>
"""
写全栈代码时 前端代码不一定要在前端页面书写
也可以先在后端写好 然后传输给前端页面
""" 

标签

# for 循环
{% for foo in se %}
    <p>{{ forloop }}</p>
{% endfor %}

{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 2, 'revcounter0': 1, 'first': True, 'last': False}


# if 判断
{% if b %}
    <p>dark</p>
{% elif True%}
    <p>souls</p>
{% else %}
    <p>sekiro</p>
{% endif %}

# if 和 for 结合
{% for foo in se %}
    {% if forloop.first %}
        <p>第一个</p>
    {% elif forloop.last %}
        <p>最后一个</p>
    {% else %}
        <p>算了吧</p>
    {% endif %}
    {% empty %}
        <p>for 循环可迭代对象是空时,即内部没有元素</p>
{% endfor %}

# 额外处理字典
{% 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 t as  %}
{% endwith %}

自定义标签、过滤器、inclusion_tag

"""
1. 在应用下创建一个名字必须叫(templatetags)文件夹
2. 在该文件夹内创建任意名称的 py 文件
3. 在该py文件内必须先书写下面两句话
    from django import template
    
    register = template.Library()
"""
# 自定义过滤器
@register.filter(name="aoteman")
def my_sum(v1, v2):
    return v1+v2

<h1>自定义的使用(过滤器最多有两个参数)</h1>
{% load MyTag %}
<p>{{ n|aoteman:666 }}</p>



# 自定义标签(参数可以有多个)类似于自定义函数
@register.simple_tag(name="plus")
def index(a,b,c,d):
    return "%s-%s-%s-%s" % (a,b,c,d)

<h1>自定义标签的使用(可以有多个参数)</h1>
{% load MyTag %}

{% plus "1" "aoteman" "alterman" "2" %}
    
    
# 自定义 inclusion_tag
"""
内部原理
    先定义一个方法
    在页面上调用该方法 并且可以传值
    该方法会生成一些数据然后传递给一个 html 页面
    之后将渲染好的结构放到调用的位置
"""
# 自定义 inclusion_tag
@register.inclusion_tag(filename="menu.html")
def left(n):
    data = ["第{}项".format(i) for i in range(n)]

    # return {"data": data} # 第一种传值

    return locals() # 将data传值给 menu.html 

# menu.html 页面
<ul>
    {% for foo in data %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>
    
# test.html
<h1>自定义 inclusion_tag 的使用</h1>
{% load MyTag %}
{% left 10 %}
    
# 总结:当一个 html 页面需要传参数才能够动态的渲染出来,并且多个页面都需要使用到该局部,那么就考虑使用 inclusion_tag 形式

模板的继承

"""
网站页面布局类似,只是某些局部在变化
"""
# 模板内容
{% block content %} # 模板中可修改的部分
{% endbloack %}

# 子页面内容
{% extends "home.html" %}

{% block content %}
	子版内容
    
    子版内容除了可以自己写自己的之外 还可以继续使用模板的内容
    {{ block.super }}
{% endblock %} # 子页面修改已声明可修改的部分

# 一般情况下模板页面上应该至少有三块可以被修改的区域
    1. CSS 区域
    2. html 区域
    3. JS 区域

模板的导入

"""
将页面的某一个局部当成模块的形式
哪个地方需要就可以直接导入使用即可
"""
{% include "wasai.html" %}

文章作者: New Ass
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 New Ass !
  目录