Loading

Django框架之模板层

【一】模板语法的传取值

  • 模板语法需要记两组符号,分别是{{}}{% %}
  • {{}}通常是与变量相关的
  • {% %}通常是与逻辑相关的

【1】传值

  • 模板语法可以传递python所有的数据类型,包括函数和类,以及类实例化的对象
  • 传递函数的时候,函数需要有返回值,要不然在页面显示的结果就是None
  • 模板语法会自动把所有能加括号调用的对象全部加括号调用,通常指代函数和类
  • 要注意的是,django模板语法并不支持带形参的函数,如果带了形参,返回的结果永远都是None

【2】取值

  • 在模板语法中,取值是通过句点符的形式取值的
  • 可以点索引,也可以点键值,也可以连续连
## views.py
class Test(View):
    def get(self, request):
        s = 'green'
        num_int = 18
        num_float = 18.88
        boolean = True
        l1 = [1, 2, 3, 4, 5, 6, '列表']
        dic = {'name': 'green', 'age': 18, 'hobby': ['洗脚', '搓背']}
        tup = (1, 2, 3, '元组')
        set_1 = {1, 2, 3, '集合'}

        class Obj:
            def one(self):
                ...

            def two(self):
                return 'two'

            def __str__(self):
                return '我被输出了'

        obj = Obj()

        return render(request, 'test.html', locals())

    def post(self):
        return HttpResponse('Tsst OK')

## html

<p>{{ s }}</p>
<p>{{ num_int }}</p>
<p>{{ num_float }}</p>
<p>{{ l1.6 }}</p>
<p>{{ dic.hobby.1 }}</p>
<p>{{ tup }}</p>
<p>{{ set_1 }}</p>
<p>{{ boolean }}</p>
<p>{{ func }}</p>
<p>{{ obj.one }}</p>
<p>{{ obj.two }}</p>
<p>{{ Obj }}</p>

【二】过滤器

【1】过滤器语法

  • 在模板语法中,过滤器相当于传到页面的值的方法
  • 过滤器的语法为 ,最多只能接收两个参数
{{value|filter_name:参数}}

【2】过滤器介绍

## 计算长度,计算value值的长度
{{ value|length }}

## 设置默认值,如果value的布尔值是True就输出value 反之则输出默认值
{{ value|default:'啥也不是' }}

## 计算文件大小,根据value值的数据计算文件大小
{{ value|filesizeformat }}

## 转换时间格式
{{ current_time|date:'Y-m-d H:m:s ' }}

## 切片操作 冒号后面的三个数字分别指代 起始位置,结束位置,步长,顾头不顾尾
{{ l1|slice:'0:3:2' }}

## 切取摘要,如果字符串字符多于指定的字符数量,那么会被截断,后面的会以...结尾
{{ value|truncatechars:9}}

## 移除指定字符
{{ value|cut:' ' }}

## 拼接字符(join)
{{ value|join:'NB' }}

## 加法(add)
{{ value|add:11 }}

## 取消转义,默认传来的字符是不识别标签的,需要取消转义才能识别
 {{ value|safe }}

【三】标签

【1】for循环

## 普通for循环
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

## for循环可用的一些参数
{% for item in l1 %}
    <p>当前循环的所有值(从1开始){{ forloop.counter }}</p>
    <p>当前循环的所有值(从0开始){{ forloop.counter0 }}</p>
    <p>当前循环的倒序索引值(从1开始){{ forloop.revcounter }}</p>
    <p>当前循环的倒序索引值(从0开始){{ forloop.revcounter0 }}</p>
    <p>判断当前是否是第一次循环{{ forloop.first }}</p>
    <p>判断当前是否是最后一次循环{{ forloop.last }}</p>
    <p>本层循环的外层循环{{ forloop.parentloop }}</p>
{% endfor %}

## empty for循环,{% empty %}通常是用在{% for %}或者{% if %}语句中的一个部分,用来指定在迭代或条件判断为空时的操作。
{% for item in items %}
    {{ item }}
{% empty %}
    <p>No items available.</p>
{% endfor %}

【2】if判断

  • 跟python的if elif else 用法很像
## if ~ elif ~ else
{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

【3】with语法

  • 用于当一个变量需要多次引用,且表达式很复杂时,可以给该变量取一个别名
{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

【4】csrf_token

  • 这个标签用于跨站请求伪造保护。
  • 在页面的form表单里面写上

【四】模板的继承

【1】模板

  • 父模板通常分成三大块,css,body,js部分
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
  {% block page-css %}
  
  {% endblock %}
</head>
<body>

<h1>这是母板的标题</h1>

{% block page-main %}

{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}

{% endblock %}
</body>
</html>

【2】继承模板

  • 在子页面的最上方继承模板
{% extends 'father.html' %}

【3】块(block)

  • 在父模板中用{% block xxx%}来定义块,声名这一块内容是可以让其他页面修改的
  • 子页面通过定义模板中的block名来修改模板对应的内容
{% block page-main %}
  <p>我是你爹</p>
  <p>你是我儿</p>
  <p>儿子你好</p>
{% endblock %}

【4】组件

  • 可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
{% include 'navbar.html' %}

【五】静态文件加载

【1】

  • 在引用一些静态文件时可以用上
## 加载Django静态文件
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

## 引用js文件
{% load static %}
<script src="{% static "mytest.js" %}"></script>

## 某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

【2】

  • 相当于获取到了 static 文件夹的文件夹绝对路径,从绝对路径再往下找静态文
posted @ 2024-03-25 17:28  HuangQiaoqi  阅读(5)  评论(0编辑  收藏  举报