模版层

变量

  • {{ }}:变相相关的
  • {%%}逻辑相关
def template_test(request):
    l = [11, 22, 33]
    d = {"name": "alex"}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return "{} is dream...".format(self.name)

    Alex = Person(name="Alex", age=34)
    Egon = Person(name="Egon", age=9000)c
    Eva_J = Person(name="Eva_J", age=18)

    person_list = [Alex, Egon, Eva_J]
    return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})



{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}

过滤器

语法 描述
{{ 变量|length }} 统计长度
{{ 变量|default:'啥也不是'}} 默认值(布尔值是True就展示第一个参数的值否在展示冒号后面的值)
{{ 变量|filesizeformat: }} 文件大小
{{ 变量|slice:'0:4:2'}} 切片操作
{{ 变量|truncatechars:9 }} 切取单词(不包含三个点 按照空格切),切取字符(包含三个点)
{{ 变量|cut:' ' }} 移除特定的字符
{{ 变量|join:'$' }} 拼接操作
{{ 变量|add:10 }} 拼接操作
{{ 变量|safe }} 转义
{{ 变量|res }} 转义
{{ 变量|'Y-m-d H:i:s' }} 日期格式化
{{ 变量| }}
{{ 变量| }}
{{ 变量| }}

标签

for循环:

{% for foo in l %}
    <p>{{ forloop }}</p>
    <p>{{ foo }}</p>  一个个元素
{% endfor %}
  {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}

if判断

{% if b %}
    <p>baby</p>
{% elif s%}
    <p>都来把</p>
{% else %}
    <p>老baby</p>
{% endif %}

for 和 if混合使用

{% for foo in lll %}
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last %}
        <p>这是最后一次啊</p>
    {% else %}
        <p>{{ foo }}</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 d.hobby.3.info as nb  %}
    <p>{{ nb }}</p>
​    在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式
    <p>{{ d.hobby.3.info }}</p>
{% endwith %}

自定义过滤器、标签、inclusion_tag

自定义过滤器


# 自定义过滤器
@register.filter(name='baby')
def my_sum(v1, v2):
    return v1 + v2
# 使用
{% load mytag %}
<p>{{ n|baby:666 }}</p>

自定义标签

# 自定义标签(参数可以有多个)			类似于自定义函数
@register.simple_tag(name='plus')
def index(a,b,c,d):
    return '%s-%s-%s-%s'%(a,b,c,d)
# 使用
标签多个参数彼此之间空格隔开
<p>{% plus 'jason' 123 123 123 %}</p>

自定义inclusion_tag

# 自定义inclusion_tag
"""
内部原理
	先定义一个方法 
	在页面上调用该方法 并且可以传值
	该方法会生成一些数据然后传递给一个html页面
	之后将渲染好的结果放到调用的位置
"""
@register.inclusion_tag('left_menu.html')
def left(n):
    data = ['第{}项'.format(i) for i in range(n)]
    # 第一种
    # return {'data':data}  # 将data传递给left_menu.html
    # 第二种
    return locals()  # 将data传递给left_menu.html
  
{% left 5 %}
# 总结:当html页面某一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部 那么就考虑将该局部页面做成inclusion_tag形式

模板的继承

母版

..............
..............
..............
{% block css%}

{%endblock%}

..............
..............
{% block content %}
{% endblock %}
...............
...............

{% block js %}

{% endblock %}


子模板

{% extends 'home.html' %}  # 继承模板
{% block css%}
写入自己的内容
{%endblock%}

{% block content %}
写入自己的内容
{% endblock %}


{% block js %}
写入自己的内容
{% endblock %}
每一个子页面就都可以有自己独有的css代码 html代码 js代码
posted @ 2020-05-28 16:04  小子,你摊上事了  阅读(83)  评论(0编辑  收藏  举报