Django之模板层
目录:
一:模板简介
不采用模板的缺陷:
- 直接将HTML代码硬编码到python代码中,对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。
- Python 代码编写和 HTML 设计是两项不同的工作,耦合度高,可能需要不同开发人员完成。
- 程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,可以进行相互引用。不必等待
二: 模版语法之变量
基本用法:{{ 变量 }}
-深度查询 .
-{{ 对象.方法 }} 方法不能传参数
-字典,列表 用 .
三 :模版之过滤器
-date
-default
-slice
...
四 :模版之标签
{%for %}
{%for a in 可迭代对象 %}
{{a.name}}
{{forloop}}
{%endfor%}
{% if 条件%}
{%elif 条件%}
{%else%}
{%endif%}
{% with %}:取别名
五 :自定义标签和过滤器
示例:
1 确认app是否已经注册 2 在app下创建一个包:templatetags 3 在包中写mytag.py 4 from django.template import Library 5 register=Library() 6 标签: @register.simple_tag(别名) def mytesttag(a,b,c) return a+b+c 过滤器 @register.filter(别名) def mytestfilter(a,b) return a+b 7 使用标签 {% load mytag%} 标签 {% mytesttag 参数1 参数2 参数3%} 过滤器 {{ 第一个参数|mytestfilter:'第二个参数'}}
六 :模版导入和继承
如何引入静态文件?
- 创建static文件夹目录
- 在setting文件内进行配置
STATIC_URL = '/static/' 该文件夹代表的是路由的根路径,不是项目目录的static文件夹
STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static'), ]
模板的导入
- 在template文件夹下写好想要的模板
- 在需要引入模板的地方:
{% include '好看模板的名字.html' %}
相当于在要引入的文件内拷贝了模板文件内的HTML代码,模板内不用写head,body等标签;
模板的继承
- 写一个母版,base.html(留一些block(盒子)),留的盒子越多,可扩展性就越高;
{% block 别名:top等 %}
{% endblock %}
- 使用:
-在一个新的html中 -{% extend 'base.html'%} 扩写留的对应的盒子 {% block top %} 扩写的内容 {% endblock %}
- 注意:
1 扩写的时候,盒子的位置无所谓,只要名字对应正确,就会正确填充 2 盒子可以不扩写,不写就是原来的样子 3 如果要显示母版盒子中原来的东西,需要 {{block.super}}----写在哪,原来的内容就放在哪
七:静态文件相关
配置
--settings文件
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'templatetags'),
]
静态文件引入
- 直接写死的路径:<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
- 用static标签,动态生成全路径:
{% load static %}
-
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
- 用get_static_prefix,只获取static的路径:
{% load static %}
<link rel="stylesheet" href="{% 用get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
inclusion_tag:返回html片段
步骤:
- 在setting文件中app是否注册
- templatetags模块:名字一定不能错
- 创建py文件(名字随意)
- from django.template import Library
- register=Library()
- 装饰器:@register.inclusion_tag('inclusiontag.html',name='别名'),第一个参数是要操作的模板
- 返回一个字典,字典中的值,可以在inclusiontag中使用
- 使用:
{%load 写的那个py文件%}
{% 函数名字 参数 参数 %}
案例:
用inclusion_tag生成图书列表:传一个数,把数据库前几条数据显示出来
templatetags/my_tag.py from django.template import Library register = Library() from app01 import models #name为别名 @register.inclusion_tag('inclusiontag.html', name='lqz') def mytest(value): #得到queryset对象 values = list(models.Book.objects.values()) #value为传入的要打印的个数 ll = [values[i] for i in range(value)] print(ll) return {'ll': ll}
<tr> {% for foo in ll %} <td>{{ foo.id }}</td> <td>{{ foo.name }}</td> {% endfor %} </tr> <h1>{{ a }}</h1>
{% extends 'base.html' %}
{% block left %}
我是首页的内容
<h1>我是index的h1标签</h1>
我是首页的内容
{% endblock %}
{% block content %}
{{ block.super }}
<h1>我是index的内容</h1>
{{ block.super }}
#加载自定义my_tag
{% load my_tag %}
#传入参数
{% lqz 3 %}
{% endblock %}

浙公网安备 33010602011771号