Django-模板层

1.模板层传值

方式1:在views重定义函数时,将函数体代码里的名字用字典的键一一对应,将该字典当做render()的第三个参数传给html文件。在html文件中通过{{键名}}的方式拿到views中的名字。
views:
def func1(request):
    name = 'max'
    age = 25
    hobby = ['soccer','read','run']
    return render(request,'func1.html', {'d1':name,'d2':age,'d3':hobby})

func1.html:
<body>
    {{ d1 }}
    {{ d2 }}
    {{ d3 }}
</body>

方式二:在views中的功能函数中将locals()当做render的第三个参数传递给html文件中,在html文件中直接拿到views中对应函数的名字。
views:
def func1(request):
    name = 'max'
    age = 25
    hobby = ['soccer','read','run']
    return render(request,'func1.html', locals())

func1.html:
<body>
    {{ name }}
    {{ age }}
    {{ hobby }}
</body>

2.模板层之标签

1.模板层if条件判断:
{% if 条件1(可以自己写也可以用视图层传递过来的数据) %}
	执行的条件
{% elif 条件2(可以自己写也可以用视图层传递过来的数据) %}
	执行的条件
{% else %}
	执行的条件
{% endif %}
'''可以只有if/else分支,elif可有可无'''、
views.py:
def index_func(request):
    a1 = 1
    a2 = 0
    return render(request,'indexPage.html', locals())

indexPage.html:
<body>
    {% if a1 %}
        <p>if成立打印的语句</p>
    {% else %}
        <p>if不成立执行的语句</p>
    {% endif %}
</body>
# 执行结果:if成立打印的语句

2.模板层for循环:
	2.1基本与方法举例说明:
views.py:
def index_func(request):
    l1 = [1, 2, 3, 4, 5]
    return render(request, 'indexPage.html', locals())    
    
indexPage.html:
<body>
    {% for l in l1 %}
        <p>{{ l }}</p>
    {% endfor %}
</body>

	2.2:forloop对象是for循环中用来判断索引值,是否是第一个或最后一个的对象。
indexPage.html:
<body>
    {% for l in l1 %}
        <p>{{forloop}}</p>
    {% endfor %}
</body>
结果:

<body>
    {% for l in l1 %}
        <p>索引值:{{forloop.counter0}}| 索引值(从1开始){{ forloop.counter }}|是否是第一个{{ forloop.first }}|是否是最后一个{{ forloop.last }}</p>
    {% endfor %}
</body>

iffor循环(forloop)结合起来:
views.py:
def index_func(request):
    l1 = ['max', 'marry', 'jason', 'jack', 'jerry']
    return render(request, 'indexPage.html', locals())

indexPage.html:
<body>
    {% for l in l1 %}
        {% if forloop.first %}
            <p>这是我最后一次循环 {{ l }}</p>
         {% elif forloop.last %}
            <p>这是我最后一次循环 {{ l }}</p>
         {% else %}
            <p>{{ l }}</p>
        {% endif %}
    {% endfor %}
</body>

3.for循环中出现无法循环的数据类型时,例如空列表,空字符串等,可以在for循环的子代码中添加{% empty %},无法循环的数据类型就会执行{% empty %}的子代码。
views.py:
def index_func(request):
    l1 = ['max', 'marry', 'jason', 'jack', 'jerry']
    l2 = []
    return render(request, 'indexPage.html', locals())

indexPage.html:
<body>
    {% for l in l2 %}
        {{ l }}
        {% empty %}
            <p>无法循环</p>
    {% endfor %}
</body>
# 执行结果:无法循环

4.django模板语法取值操作:只支持句点符,句点符可以点索引值也可以点字典的键。
views.py:
def index_func(request):
    dict1 = {'name':'max','list':[1,2,3,4,5,{'city':'shanghai','province':'guangdonng'}]}
    return render(request, 'indexPage.html', locals())

indexPage.html:
<body>
    {{ dict1.list.5.city }}
</body>
# 执行结果:shanghai

3.自定义过滤器、标签及inclusion_tag(了解)

"""
如果想要自定义一些模板语法 需要先完成下列的三步走战略
	1.在应用下创建一个名字必须叫templatetags的目录
	2.在上述目录下创建任意名称的py文件	
	3.在上述py文件内先编写两行固定的代码
		from django import template
		register = template.Library()
"""
1.自定义过滤器:最大只支持两个参数,通过 参数1|过滤器名:参数2 来传值
在templatetags中新建一个py文件名叫mytag.py,在mytag中定义过滤器,在views中给html页面传值,传值需要两个大括号包起来,并在前端页面展示:
mytag.py:
@register.filter(name='myplus')
def func1(a, b):  # 函数名随意起,在前段页面只需要根据name就可以找到
    return a + b

views.py:
def index_func(request):
    a = 2
    b = 5
    return render(request, 'indexPage.html', locals())

indexPage.html:
<body>
    {% load mytag %}  # 相当于导入模块
    <p>{{ a|myplus:b }}</p>
</body>
# 执行结果:7

2.自定义标签:参数个数没有限制,在html页面传值通过标签名 空格 值的方式来传值,传值只需要一个大括号。
mytag.py:
@register.simple_tag(name='mytag')
def func2(a,b,c,d):
    return f'{a}:{b}:{c}:{d}'

indexPage.html:
<body>
    {% load mytag %}
    {%  mytag 'max' 'jerry' 'henry' 'kevin' %}
</body>
# 执行结果:max:jerry:henry:kevin

3.自定义inclusion_tag(局部的html代码):先在indexPage.html中调用mymenu,然后将处理好的标签(字符串类型)列表传给menu.html文件,在menu.html中遍历所有的标题。
mytag.py:
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
    html = []
    for i in range(n):
        html.append('<li>第%s页<li>' % i)
    return locals()

menu.html:
{% for a in html %}
    {{ a|safe }}  # safe的功能是将字符串的标签显示在页面上
{% endfor %}

indexPage.html:
<body>
    {% load mytag %}
    {% mymenu 20 %}
</body>

4.模板的继承与导入

模板的继承(重要):多个页面有很多相似的地方,我们可以采取下列方式:
    方式1:传统的复制粘贴
    方式2:模板的继承(相当于划分出一块区域,该区域被模板语法包起来之后就可以自己编辑样式和内容,其他部分依旧沿用被继承的页面)
    
1.在模板中使用block划定可以修改的区域:
{% block 区域名称 %}
{% endblock %}

2.子板继承模板:
{% entends '被继承的html文件' %}
{% block 区域名称 %}
	子板的内容
{% endblock %}
'''form表单中的action如果为空还是向当前页面提交数据'''

PS:模板中至少应该有三个区域,:页面内容区、css样式区、js代码区

3.当我们想要继承模板,并且想要改被继承模板的样式(例如颜色),如果被继承页面没有script标签,我们依旧需要在被继承模板的head标签内划定修改的区域(以修改标题颜色为例):
被继承html文件:
<head>
	{% block css %}
    # 中间可以什么都没有
    {% endblock %}
</head>

继承html文件:
{%  extends 'myhtml.html' %}
{% block css %}
    <style>
        #d1 {  # 把要修改的标题id定义成d1
            color: #5bc0de;
        }
    </style>
{% endblock %}

4.模板也可以继承父类模板之后继续在父类的基础上做扩展,该方法类似面向对象中的继承中的super方法,沿用父类的方法,并且做一些扩展。并且可以连续继承多次。
语法结构:
{% block content %}
{{ block.super }}  (写几次父类中的目标范围的内容就会在子页面出现几次)
# 需要添加的其他内容
{% endblock %}

5.模板的导入:当有一个很漂亮的部分页面,我们想要借鉴的话,可以直接将该模板文件当做模块导入,导入的位置就会插入该内容。
语法结构:{% include 'html文件名' %}

posted @   ERROR404Notfound  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
Title
点击右上角即可分享
微信分享提示