Django之模板HTML(模板渲染(字符,列表,字典),继承母版(extends ,extends), templatetags(simple_tag,filter))【交互篇三】

本文介绍了Django模板的渲染方法,包括后端render、前端字符、列表、字典渲染及IF判断。讨论了HTML继承母版的全局extends和局部include,以及templatetags的simple_tag和filter的使用,提供了实战链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇:Django之view视图处理【交互篇二】点击跳转
目录篇:Django之前后端交互篇目录 点击跳转
下一篇:Django之CSRF XSS原理解析【交互篇四】点击跳转

目录


各种模板渲染

简单理解:来说就是后端把html里面的特殊符号{{ }}内容替换成我们给的内容,又或者你可以理解成后端给一个变量给前端使用

更深入了解跳转:web框架的本质(socket,WSGI)https://blog.youkuaiyun.com/Burgess_zheng/article/details/86496202

    后端进行render

def tem_render(request):
    current_user = 'Burgess'
    user_dict = {'k1': 'v1', 'k2': 'v2', }
    user_list = ['xiaoming', 'xiaohong']
    age = 18
    return render(request, "render.html", {'current_user': current_user,
                                              "age": age,
                                              'user_list': user_list,
                                              'user_dict': user_dict,
    })

     前端进行渲染(字符渲染,列表渲染,字典渲染,IF判断渲染,if嵌套到for循环里面,forloop)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
前端变量:
current_user = 'Burgess'
user_dict = {'k1': 'v1', 'k2': 'v2', }
user_list = ['xiaoming', 'xiaohong']
age = 18
-->
<div>--------------------字符串-------------------</div>
<!--字符串取值(渲染)-->
	<div>{{ current_user }}</div>  <!--获取结果: Burgess  -->
    <div>{{ current_user.0 }}</div>  <!-- 获取结果: B  -->

<div>--------------------列表-------------------</div>
<!--列表根据下标直接取值(渲染) -->
	<a>{{ user_list.0 }}</a>    <!--获取结果: xiaoming  -->
	<a>{{ user_list.1 }}</a>    <!--获取结果:xiaohong  -->

<!--for循环列表取值 -->
	<ul>
		{% for row in user_list %}
			<li>{{ row }}</li>    <!--获取结果: row=xiaoming && row=xiaohong-->
			<li>{{ row.0 }}</li>  <!--如果是row=xiaoming 获取结果为字符: x -->
			<li>{{ row.1 }}</li>  <!--如果是row=xiaoming 获取结果为字符: i -->
		{% endfor %}
	</ul>

<div>--------------------字典-------------------</div>
<!-- 字典根据key直接取值 -->
	<a>{{ user_dict.k1}}</a>   <!--获取结果: v1 -->
	<a>{{ user_dict.k2}}</a>   <!-- 获取结果: v2 -->

<!-- for循环列表取值 -->
	<ul>
		<!--循环获取该字典的key -->
		{% for row in user_dict %}
			<li>{{ row }}</li> <!-- 获取结果为字典key: v1 && v2 -->
		{% endfor %}

        <!--循环获取该字典的key -->
		{% for row in user_dict.keys %}
			<li>{{ row }}</li> <!--获取结果为字典key: v1 && v2 -->
		{% endfor %}

        <!--循环获取该字典的value -->
		{% for row in user_dict.values %}
			<li>{{ row }}</li> <!-- 获取结果字典的value: k1 && k2-->
		{% endfor %}

        <!--循环获取该字典的key和value(元组形式)-->
		{% for row in user_dict.items %}
			<li>{{ row }}</li>
			<!--获取结果为元祖包含key和value:row= ('k1', 'v1') && row= ('k2', 'v2') -->
		{% endfor %}
		<!--循环获取该字典的key和value(分别赋值)-->
		{% for k,row in user_dict.items %}
			<li>{{ k }}---{{ row }}</li>
			<!-- 获取结果:k= k1 row=v1 && k= k2 row=v2 -->
		{% endfor %}
	</ul>

<div>--------------------if判断-------------------</div>
	<!-- if判断 -->
	{% if age %}  <!--假如age 的value大于0 就证明是true -->
		<a>有年龄</a>
		{% if age > 16 %}
			<a>老男人</a>
		{% else %}
			<a>小鲜肉</a>
		{% endif %}
	{% else %}
		<a>无年龄</a>
	{% endif %}

<div>--------------------IF嵌套到FOR循环里面-------------------</div>
	<ul>
		{% for row in user_list %}
			{% if row == "xiaoming" %}  <!--假如row==xiaoming-->
				<li>{{ row }}</li>  <!--row = xiaoming -->
			{% endif %}
		{% endfor %}
	</ul>

<div>--------------------forloop参数-------------------</div>
	<ul>
		{% for row in user_list %}
		    <div>{{ forloop.counter }}</div>
<!--user_list=['xiaoming','xiaohong']   所以是循环两次  {{ forloop.counter }}分别==1 && 2  -->
		{% endfor %}
<!--
forloop.counter  记录循环次数(从1开始),获取当次循环次数作为标签内容
forloop.counter0  记录循环次数(从0开始),获取当次循环次数作为标签内容
forloop.revcounter  记录循环次数(次数最高到1),获取当次循环次数作为标签内容
forloop.revcounter0  记录循环次数(次数最高-1到0),获取当次循环次数作为标签
forloop.first,第一循环:标签内容True,其他标签内容False
forloop.last,最后一个循环:标签内容True,其他标签内容False
forloop.parentloop:  for嵌套循环的时候, 获取父循环次数作为子循环标签的内容
forloop.parentloop后面 点. + 下面任意一个 获取选择的值做标签内容forloop.first,forloop.last,revcounter0 ,revcounter ,counter0 ,counter
-->
	</ul>



</body>
</html>

    得到的结果

    注意:数据类型取值和Python的区别

通过模板HTML语言进行数据类型取值都是通过点
    v=obj(id,name,....)
        #对象取值方式:通过点如:v1.id
    
    v={'id':1,'caption':'运维部'}
        #字典取值方式:Python:v ["key"]、
        #模板渲染通过点如:v.id

    v= (1,2)
        #元组取值方式:Python: v[下标]
        #模板渲染:v.下标

    v=[1,2]
        #列表取值方式:Python:v[下标]
        模板渲染:v.下

 

 

HTML继承母版(全局extends, 局部include)

实战Django之继承母版(extends, include): https://blog.youkuaiyun.com/Burgess_zheng/article/details/86548311

    extends

继承全局母版
场景:多个模板的格式和部分标签相同的时候,继承相同的部分,不同的部分根据母版的block块进行替换内容

母版(在不通用的位置进行block,这样继承人可以自定制内容,继承者只能继承1次)

    master.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title %} {% endblock %}
<!--block:母版的块title:块名:继承该母版的模板可根据该块名替换该块内容-->
    </title>
    <link rel="stylesheet" href="/static/commons.css"/>
    <style>
        .pg-header{
            height:48px;
            background-color: seashell;
            color: #eec84a;
        }
    </style>
    {% block css %} {% endblock %}
<!--block:母版的块 css:块名:继承该母版的模板可根据该块名替换该块内容-->
</head>
<body>
    <div class="pg-header">Bugess</div>

    {% block content %} {% endblock %}
    <!--block:母版块content:块名:该块内容可被替换,模板继承以后可根据该名字替换该块内容 -->
    <script src="/static/jquery.min.js"></script>
    {% block js %} {% endblock %}
<!--block:母版的块 js:块名:继承该母版的模板可根据该块名替换该块内容-->
</body>
</html>

继承者(拥有母版的所有标签,且根据对应block位置插入自定制内容):

    successor.html

{% extends 'master.html' %}
{% block title %} {% endblock %}
{% block conent %} {% endblock %}
{% block css %} {% endblock %}
{% block js %} {% endblock %}

需注意:
1.母版的固定代码,如果被修改,那么所有的继承模板都会修改到
2.css和js还是要注意,一定要在母版的head 和body最下面专门弄个块,这样继承模板才可以写自身的css 和js
 

    include

导入局部母版
场景:标签重复被调用的时候,或者该标签代码多(为了页面的整洁)进而导入

局部内容标签(允许被导入多次)

   tag.html

<h1>xx<h1>

导入者(导入指定的文件以后,该文件的内容进入插入到include位置)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% include 'tag.html' %}
</body>
</html>

 

 templatetags(simple_tag,filter)

实战django之simple_tag and filter: https://blog.youkuaiyun.com/Burgess_zheng/article/details/86548240

     简单理解:HTML调用Python写的函数

      系统自带simple.tag     

      自定制simple.tag

        1.在某个app下创建一个templatetags目录(目录名不能更改其他的

        2. templatetags目录下创建任意py文件(py文件名没限制)

        3.py文件需要导入指定模块实例化一个template对象 (名字必须为:register = template.Library())

        4.该对象调取继承类的simple_tag方法对自定义函数进行装饰 装饰器:@register.simple_tag or @register.filter(有要求,参数固定最多2)

        5. 注册 templatetags目录所在的app

        6.模板文件调用

               1.顶部导入自定义函数文件格式:{% load 要调取的函数所在文件名 %} 

               2.simple_tag调取函数格式: simple_tag{% 函数名实参” ”实参” %}   fiter: {{”实参”|函数名:”实参”}}

上一篇:Django之view视图处理【交互篇二】点击跳转
目录篇:Django之前后端交互篇目录 点击跳转
下一篇:Django之CSRF XSS原理解析【交互篇四】点击跳转​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值