Django中Template理解

本文深入解析Django模板系统,涵盖Template与HTML的区别、模板语法、变量传递、条件循环、继承与包含等核心概念,助您掌握Django网页渲染机制。

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

Template不同于普通的HTML文本

Template与普通HTML本质上都是普通的文本,不同的是Template由HTML代码与逻辑控制代码(包括后台传来的参数)组成
html可以通过浏览器直接打开,Template则需要通过django后台渲染后才是完整的HTML代码,再由浏览器渲染。

Demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<h1>{{ data }}</h1>
</body>
</html> 

这段代码当成纯HTML是这样的:
在这里插入图片描述
当它是Template交给后台视图函数渲染后是这样的:
在这里插入图片描述
附上后台函数:

def demo(request):
    data = '后台传来的数据'
    return render(request,'Demo.html',{'data':data})

所以综上所述,html里面有django的模板语法了它就不是html文件了,这样的文件就叫做模板

模板语法

1:传递变量(使用两个大括号来引用)

template中语法 {{ data.row}}
view 中的代码
data={'row':"hello world!!"}
中 return render(request,'index.html',{'data':data)

1:模板语法标签{% tag%}
利用模板语法标签可以在html代码中插入Python代码来实习一些功能

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	{#插入Python代码实现for循环,data也是后台传入的数据#}
    {% for row in data %}
        <h1>{{ row }}</h1>
    {% endfor  %}
</body>
</html>
#顺便插入后台代码
def demo(request):
  	data={
  		'h1':'11111',
  		'h2':'2222',
  		'h3':'3333',
  		}

if,with语句功能类似

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django 模板</title>
</head>
<body>
    {% if num > 200 %}
        <p>大于</p>
    {% elif num == 200 %}
        <p>等于</p>
    {% else %}
        <p>小于</p>
    {% endif %}

</body>
</html>

csrf_token :跨站点请求伪造保护
提交数据的时候会做安全机制,当用户点击提交的时候会出现一个forbidden错误,就是用settings配置里面的csrf做的安全机制,如果我们不需要使用,可以将其注释。或者在form表单下面添加{% csrf_token %}来解决该问题(这才是真正的解决办法,注释不是解决办法)。

form表单下切记要加{%csrf_token%},或者注释掉csrf相关中间件,不然会报403错误

<form>
   {% csrf_token %} }}
</form>

万能句点符(深度变量查找)

模板语言可以用句点符简单的处理复杂的数据结构,列表,字典,自定义对象,都可以用‘.’句点符引出。

# 首先,句点可用于访问列表索引,例如:

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
'Item 2 is carrots.'

#假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:
>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
'Sally is 43 years old.'

#同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有
#year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
'The month is 5 and the year is 1993.'

#这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适
#用于任意的对象。
>>> from django.template import Template, Context
>>> class Person(object):
...     def __init__(self, first_name, last_name):
...         self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
'Hello, John Smith.'

#点语法也可以用来引用对象的方法。 例如,每个 Python 字符串都有 upper() 和 isdigit()
#方法,你在模板中可以使用同样的句点语法来调用它们:
>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
'123 -- 123 -- True'

#注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的
#方法。

变量过滤器(filter)的使用

语法格式{{obj|filter:param}}


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

extend模板继承

include 模板标签
{% include %},该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。
extend(继承)模板标签
到目前为止,我们的模板范例都只是些零星的 HTML 片段,但在实际应用中,你将用 Django 模板系统来创建整个 HTML 页面。 这就带来一个常见的 Web 开发问题: 在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?

解决该问题的传统做法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中。 事实上, Django 通过刚才讲述的 {% include %} 支持了这种方法。 但是用 Django 解决此类问题的首选方法是使用更加优雅的策略—— 模板继承 。
本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。
<1>如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

 <2>一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此
    你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越
    多越好。

 <3>如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
    如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模
    板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。

 <4>不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。
    也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个
    相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。
    ````
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值