Django 模板语法基本知识

本文介绍了Django模板的基本用法,包括变量的使用、深度查询和过滤器,详细讲解了标签如for、if、with以及csrf_token等,并探讨了自定义标签和过滤器的实现方法,最后讨论了模板的继承机制。

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

01基本用法

  • 变量:{{ }}
    • 1 深度查询 句点符
    • 2 过滤器
  • 标签:{% %}

02变量

  • html文件中用{{ 变量名 }}做占位符

  • views.py中通过render第三个参数传入字典类型的变量 { “变量名” : 值 }

def timer(request):
    import datetime
    date1 = datetime.datetime.now()
    date = date1.strftime("%Y-%m-%d %H:%M:%S")

    return render(request, "timer.html", {'date': date})

如果需要传入的变量过多时,可以直接把字典换成 locals(),

可以自动全部传入,但是注意,传入的键和值的名字一样

深度查询01
<p>{{ l.1 }}</p>	// 变量为列表,通过列表名.索引

<p>{{ info.name }}</p>	// 变量为字典,通过字典.键

<p>{{ alex.name }}</p>	// 变量为类的对象,通过对象.属性

<p>{{ alex.age }}</p>	// 变量为类的对象

# 不管有几层都可以用"."来实现查询
过滤器02
{{ obj:filter_name:param }}

# default
# 如果一个变量是false或者为空,使用给定的默认值,否则,使用变量值
{{ value|default:"nothing" }}

# length
# 返回值的长度,他对字符串和列表都起作用


# filesizeformat
# 将值格式化为一个“人类可读的”文件尺寸,( 4.1 MB,102 bytes等)


# date
# 如果value=datetime.datetime.now()
{{ value|date:"Y-m-d" }}


# slice
# 切片
{{ value|slice:"2:-1"  }}

# truncatechars/truncatewords
# truncatechars 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以"..."结尾
# truncatewords 如果字符串单词多于指定的单词数量,那么会被截断。截断的字符串将以"..."结尾
{{ yours|truncatechars:5 }}
{{ yours|truncatewords:2 }}


# safe
# 正常不加  safe  的话Django遇到变量内容是标签一类的会渲染成特殊符号传给浏览器
# 如果加上  safr  就告诉django该内容是安全的可以直接渲染成标签
{{ link|safe }}

03 标签

{% %}

  • for循环标签
{# for循环 #}

{% for i in li %}
	<p>{{ i }}</p>
{% endfor %}


{% for i,j in dic %}
	<p>{{ i }}  {{ j }}</p>
{% endfor %}

for循环中放入{{ forloop.counter }}加入计数
{% for i in dic %}
	<p>{{ forloop.counter }}&nbsp;{{ i }}</p>
	{% empty %}				{# 如果列表非空就执行上面的,否则执行empty和下面的p标签 #}
	<p>列表为空</p>
{% endfor %}

  • if标签‘
{% if user %}
<p>
    <a href=''>hi {{ user }}</a>
    <a href=''>注销</a>
</p>
{% else %}
<p>
    <a href=''>登录</a>
    <a href=''>注册</a>
</p>
{% endif %}
  • with标签

    • 使用一个简单的名字缓存一个复杂的变量;

    • {% with person_list.1.name as n %}
      	{{ n }}
          {{ n }}
          {{ n }}
      {% endwith %}
      
  • csrf_token标签

    • 这个标签用于跨站请求伪造保护

    • 因为你没有这个标签但是提交请求的话,服务器会给你拦截不允许你发POST请求

    • 而添上这个之后服务器识别到你有这个标签的"身份证号"就会允许你发POST请求

    • <form actioin="" menthod="post">
          {% csrf_token %}
          <input type="text" name="user">
          <input type="submit">
      </form>
      

04自定义标签和过滤器

  • 首先在settings中INSTALLED_APPS配置当前的app,不然django找不到自定义simple_tag

  • 在app中创建templatetags模块(库文件夹)只能叫templatetags

  • 在新建的库中创建任意.py文件,这里名为my_tag_filter

    • # 自定义过滤器
      from django import template
      
      register = template.Library()
      
      @register.filter
      def multi_filter(x, y):
          return x*y
      
    • # 自定义标签
      from django import template
      
      register = template.Library()
      
      @register.simple_tag
      def multi_tag(x, y):
          return x*y
      
  • 在需要使用自定义过滤器的文件导入方法

    • {% load my_tag_filter %}
      <p>
          {{ i|multi_filter:20 }}
      </p>
      
  • 特点:自定义过滤器最多可以传入两个参数,而自定义标签没有限制

  • image-20210731221455671

05继承

{# 引入一段HTML代码(这些代码存放在一个单独的文件中,不是完整的HTML文件) #}

{% include "advertise.html" %}

{# 相当于外部引入一段代码,但不是继承 #}

真正的继承标签

// 模板HTML

{% block 盒子名 %}		// 给要继承的文件,留扩展代码的盒子
{% endblock %}

{# 在模板HTML的可扩展部分中加入block标签,继承之后的文件就可以在该区域扩展 #}

{# 在模板HTML的可扩展部分中加入block标签,继承之后的文件就可以在该区域扩展 #}


{% extends "base.html" %}	// 继承

{% block 盒子名 %}		// 添加该盒子HTML代码

{% endblock %}
{% block 盒子名 %}		// 添加该盒子HTML代码

{{ block.super }}	// 继承base盒子中的内容,并且续写。如果不加这个就会覆盖base中的内容。

...

{% endblock %}
image-20210801204045470
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值