模板

在Django框架中,模板是可以帮助开发者快速生成呈现给用户页面的工具
模板的设计方式实现了我们MVT中VT的解耦,VT有着N:M(多对多)的关系,一个V可以调用任意T,一个T可以供任意V使用

在开发中还可以写一些简单的逻辑语法,比如ofr循环,if判断

模板处理分为两个过程

  ①
加载
  ②
渲染

实践:

我们建立新的工程名曰:DAY2
建立项目App,改settings中的数据库,app,time_zone,语言,时间
添加总路由,子路由,创建数据库,连接数据库

在模板中建立HTML文件
名曰:index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
<h3>今儿天气不错</h3>
</body>
</html>

接着urls:
url('index/',views.index),
接着views:

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from django.template import loader


def hello(request):
    return HttpResponse('hello')


def index(request):
    # 本质上也是返回的httpresponse,帮我们把模板和context数据,渲染成字符串
    # return render(request, 'index.html')
    #等同于
    temp = loader.get_template('index.html')
    content = temp.render()
    return HttpResponse(content)

代码要见名知意

模板组成部分

模板主要有两个部分

  ① HTML静态代码(html可见到的东西都是不可信的,都是可以任意更改的)
  ②
动态插入的代码段(挖坑,填坑)

模板中的动态代码段除了做基本的静态填充,还可以实现一些基本的运算,转换(转换大小写)和逻辑

模板中的变量:  

视图传递给模板的数据
       遵守标识符规则(拒绝字符空格,中文关键字,保留字,数字开头)
  语法{{ 
var }}
  如果变量不存在,则插入空字符串

模板中的小弊端,调用对象的方法,不能传递参数

模板中的标签

语法 {%  tag  %}
作用 1. 加载外部传入的变量
2. 在输出中创建文本
3. 控制循环或逻辑
例如for循环

模板中的语法

点语法grades grade

功能:

  1. 字典查询
  2. 属性或者方法 grade.gname
  3. 索引 grades.0.gname

实践:点语法

建立models

from django.db import models


class Student(models.Model):
    s_name = models.CharField(max_length=16)

插入数据:

(venv) E:\djstudy\day3>python manage.py shell
Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 14 2019, 23:09:19) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from App.models import Student
>>> for i in range(10):
...     student =Student()
...     student.s_name = '小明%d' % i
...     student.save()

views函数中

def get_students(request):
    students = Student.objects.all()
    data = {
        'students': students
    }

    return render(request, 'student_list.html', context=data)

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>student_list</title>
</head>
<body>
<ul>
    {% for student in students %}
    <li>{{ student.s_name }}</li>
    {% endfor %}

</ul>

我们可以看到:

①说明student.s_name可以直接调用属性

②另外我们还可以用点函数在模板中调用models中定义的函数

class Student(models.Model):
    s_name = models.CharField(max_length=16)
# 定义函数,该函数用来返回属性
    def get_name(self):
        return self.s_name

html

<ul>
    {% for student in students %}
    <li>{{ stedent.get_name }}</li>
    {% endfor %}

</ul>

这样可以通过函数调用属性
但是,测试结果有坑(暂时未知错误原因)

③可以建立索引

html

<h3>{{ students.0.s_name }}</h3>

可以看到

查找到了小明0

④利用字典调用出数据

views中添加student_dict字典
然后将student_dict传入到data中,这样就能在html中调用这个字典了

def get_students(request):
    students = Student.objects.all()
    student_dict = {
        'hobby':'coding',
        'time':'one year'
    }
    data = {
        'students': students,
        'student_dict': student_dict
    }

    return render(request, 'student_list.html', context=data)

html

<h3>{{ student_dict.hobby }}</h3>


成功显示

if语法

格式:  {%
if  表达式 %}
          语句
  {% endif 
%}
  {%  if 表达式 %}
          
语句
  {% else 
%}
          
语句
  {% endif %}
  {% if 表达式
%}
                      语句 
   {% elif 表达式 %}
                      语句
  {% endif %}

if的表达式返回的是布尔值

for语法

{%
for 变量 in 列表 %}
  语句1
       {% empty %}                           
  语句2
{% endfor %}
作用:当列表为空或不存在时,执行empty之后的语句

{{ forloop.counter }} 表示当前是第几次循环,从1数数
{{
forloop.counter0}}表示当前是第几次循环,从0数数
{{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停
{{
forloop.revcounter0}}表示当前第几次循环,倒着数,到0停
{{ forloop.first }} 是否是第一个  布尔值
{{ forloop.last }} 是否是最后一个
布尔值

实践:if,for语法

当循环为空时我们可以利用empty返回一串字符

    {% for student in students %}
    <li>{{ stedent.get_name }}</li>
        {% empty %}
        <h1>小明辍学了</h1>
    {% endfor %}

我们也可以用forloop.counter在姓名前加上序号

<ul>
    {% for student in students %}
    <li>{{ forloop.counter }}:{{ student.s_name }}</li>
    {% endfor %}

</ul>


我们还可以用forloop.first将第一个同学姓名标记成红色,最后一个标记成绿色

{% for student in students %}
    {% if forloop.first %}
        <li style="color:red"> {{ student.s_name }}</li>
        {% else %}
        <li>{{ student.s_name }}</li>
    {% endif %}

{% endfor %}


乘除语法

  {% widthratio 数  分母 
分子  %}

<h3>{{ count }}</h3>
<h3>{% widthratio count  1 5 %}</h3>
<h3>{% widthratio count  5 1 %}</h3>


整除语法

    {%
if num|divisibleby:2 %}

实践:隔行变色

<ul>
    {% for student in students %}
    {% if forloop.counter|divisibleby:2 %}
        <li style="color:red">{{ student.s_name }}</li>
        {% else %}
        <li style="color:green">{{ student.s_name }}</li>

    {% endif %}
    {% endfor %}

</ul>

快捷键

ctrl+d复制一行,插入到下面
alt+shift+↑↓ 移动一行

模板中的注释

单行注释

  {#  被注释掉的内容  #}

多行注释

  {% comment %}
  内容
  {% endcomment %}

注释中的笑话:

1.
html中注释是
等客户交钱提升响应速度

<!--
    老板说让咱们把第一版写的卡一点,等客户交钱优化,我们给他提升一下响应速度
-->
time.sleep(3)

但是这样f12一下

就能看到注释,被别人发现了
所以不被发现使用
使用这样的注释:

单行
{#  内容 #}

多行
{% comment %}
内容
{% endcomment %}

2.
找移动电信的官网,有一些业务提前部署到网站上,但是被注释隐藏起来,可以去寻找漏洞,自己办理业务,好用就先用着,不好用就打电话投诉乱扣钱,甩锅给移动电信后台出问题。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏