模板
在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
功能:
- 字典查询
- 属性或者方法 grade.gname
- 索引 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>
④利用字典调用出数据
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 %}
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.
找移动电信的官网,有一些业务提前部署到网站上,但是被注释隐藏起来,可以去寻找漏洞,自己办理业务,好用就先用着,不好用就打电话投诉乱扣钱,甩锅给移动电信后台出问题。
此处评论已关闭