模板
在django框架中,模板是可以帮助开发者快速生成呈现给用户页面的工具
模板的设计方式实现了我们MTV中的VT解耦,VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用。
模板处理分为两个过程:加载和渲染
temp = loader.get_template('index.html')
content = temp.render()
return HttpResponse(centent)
以前都是这样写的
但是现在有了Django 自带的渲染器可以直接
return render(request,'index.html')
但其实render这个返回的也是一样的
模板主要有两个部分
HTML静态代码
动态插入的代码段(挖坑,填坑)
模板中的动态代码段除了做出基本的静态填充,还可以实现一些基本的运算,转换和逻辑
模板中的变量:视图传递给模板的数据;遵守标识符规则;语法{{var}};如果变量不存在,则插入空字符串
模板中的点语法:
grades grade
字典查询 调用K的方式
属性或者方法 grade.gname
索引 grades.0.gname
模板中的小弊端,调用对象的方法,不能传参数
模板中的标签
语法:{% tag %}
作用:1.加载外部传入的变量 2.在输出中创建文本 3.控制循环或者逻辑
{% for student in students %}
<li>{{ student.s_name }}</li>
{% endfor %}
{% for student in students %} 属性或者方法
<li>{{ student.get_studentname }}</li>
{% endfor %}
<h3>{{ students.0.s_name }}</h3> 索引
<h3>{{ student_dict.hobby }}</h3> 字典查询 调用K的方式
----------------------------------------------------------------
上面的代码
def get_students(request):
student = Student.objects.all()
student_dict = {
'hobby':'base',
'foood':'chik',
}
data = {
'students': student,
'student_dict':student_dict
}
return render(request, 'student_list.html', context=data)
--------------------------------------------------------------------
for
{%for变量in列表%}
语句1
{%empty%}
语句2
{%end%}
当列表为空或者不存在的时候,执行empty之后的语句
{{forloop.counter}}表示当前是第几次循环,从1数数
{{forloop.counter0}}表示当前是第几次循环,从0数数
{{forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停
{{forloop.revcounter0}}表示当前是第几次循环,倒着数数,到0停
{{forloop.first}}是否第一个是布尔值
{{forloop.last}}是否最后一个是布尔值
注释
单行注释
{#被注释掉的内容#}
多行注释
{%comment%}
内容
{%endcomment%}
乘除
{%widthratio 数 分母 分子%}
整除 可以用于单双行不同颜色
{% if num | divisibltby:2 %]
ifequal 如果相等
{% ifequal value1 value2%}
语句
{%endifequal%
ifnotequal 如果不相等
url:反向解析
{%url'namespace:name' p1 p2%}
csrf_token 用于跨站请求伪造保护的
格式{%csrf_token%}
过滤器:{{var|过滤器}}
作用:在变量显示修改之前
加法: {{p.page|add:5}}
减法:{{p.page|add:-5}}
小写:{{p.page|lower}}
大写:{{p.page|upper}}
可以传递参数,参数需要使用引号引起来
比如join:
{{student|join'='}}
默认值default 格式:{{var|default value}}
如果变量没有被提供或者是空的,会使用默认值
根据制定格式转换日期为字符串,处理时间的
就是针对data进行日期转换
{{dateVal|date:'y-m-d'}}
HTML转义
将接收到的数据当成普通字符串处理还是当成html代码进行处理来渲染的一个问题
这个就是在views中写了html语言,不会渲染的情况下
渲染成一个html:{{code|safa}}
{%autoscape off%}
code
{%endautoscape%}
不想渲染
{%autoescape%}
code
{%endautoescape%}
模板继承
模板也可以继承
关键字block:挖坑
{%block XXX%}
code
{%endblock%}
extends 继承,写在开头位置
{%extends'父类模板路径'%}
include:加载模板进行渲染
格式{%include'模板文件'%}
python最完美的就是继承
当作网页的时候 可以把它分开。头部 内容 等等
结构标签
block:
块
用来规划我们的布局(挖坑)
首次出现表示规划
第二次出现表示填充以前的规划
第三次出现表示填充以前的规划,默认动作是覆盖
如果不想覆盖可以添加{{block.super}}
这样就实现了增量式操作
extends
继承
可以获取父模板中的所有结构
include
包含
可以将页面作为一个模块嵌入到其他页面中
一般会受用include+block去使用
三个标签可以混合使用,能用block+extends可以完成的,尽量用这两个完成,因为inculde的加载速度偏慢
css的格式:
1.在setting里面修改:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
2.在父模板里面加入一个坑:
{% block ext_css %}
{% endblock %}
3.在要的页面里面填坑:
{% block ext_css %}
{# <link rel="stylesheet" href="/static/css/home.css">#}
<link rel="stylesheet" href="{% static 'css/home.css' %}">
{% endblock %}
静态资源:
动静分离
创建静态文件夹
在settings中注册STATICFILES_DIRS=[]
在模板中使用
先加载静态资源{%load static%}
使用{%static 'xxx'%}xxx是相对路径
坑点:
仅能在开发者模式下使用
以后需要自己单独处理