模板继承and自定义模板标签和过滤器
自定义模板标签和 过滤器:
因为模板标签和过滤器只给我们提供了 这么多 无法对我们的使用造成更多的便利 ,剩下的就需要我们自己去创建新的 模板标签和过滤器了
1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
2、在app中创建templatetags模块(模块名只能是templatetags)
3、创建任意 .py 文件,如:my_tags.py
首先你需要在你的app中创建新的一个规定好的文件夹这个文件夹的名字是规定好的:templatetags
然后在这个文件夹内创建你的py文件
from django import template from django.utils.safestring import mark_safe #这个模块是进行跳转的时候的必须的模块 register = template.Library() #创建这个对象 @register.filter # 用这个装饰器 来装饰我们的函数 def multi_filter(x,y): return x*y @register.filter def link_tag(href): return mark_safe('<a href = %s>click</a>'%href)
下面通过urls分发视图找到views内的对应的templace内的自定义标签 随之 执行
{% load my_filter_tag %} {#这一步是找到你的创建的自定的规则#} <p>{{ num|multi_filter:2 }}</p> {#在你的规定中你的multi_filter是求出两个数的乘数的#}
<p>{{ 'http://www.baidu.com'|link_tag }}</p> {#找到你的规定内的link_tag这个函数是定义一个按钮进行跳转的#}
模板继承 (extend):
1、创建一个base.html文件,
2、把要显示的页面的内容写在这里面,也就是html要在浏览器显示的内容
3、在right里面写个盒子
{% block classinfo %}
{% endblock %}
在这里面写个空盒子,以后谁来扩展就在这个盒子里面添加相应的内容就行了
4、然后再创建一个.html文件,让这个继承base.html文件,
{% extends "base.html" %} #必须是在文件的第一行
在基板里面添加内容
{% block classinfo %}
<h2>首页</h2>
<h2>学生信息</h2>
<h3>{{ class_id }}班</h3>
{% endblock%}
5、也可以写好多盒子,
在left中写个盒子
{% block menu %}
<p>I see you you</p>
{% endblock %}
模板继承是当你的templace内的html文件有多余的重复内容之后难道你要每一个都去重复的写吗?不 这个时候就用到了继承了
就好比你去浏览一个网页有很多网页是 当你浏览这个网页的时候你再点击这个网页内的其他的内容 那么可能你的顶部或者左边的某一部分还是不变的 那么这就用到了模板的继承(后面的使用很多的)
include 继承
{% include 'advertise.html' %}
上面是继承了advertise.html内的所有的内容 {#include是直接把所有的内容给复制过来这个不太好没有规定#}
这个模版,我们把它叫作 base.html
, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。
在这个例子中, block
标签定义了三个可以被子模版内容填充的block。 block
告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。
子模版可能看起来是这样的:
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
可修改的模板:
{% block title %} {#这个是定义一个可以修改的块 这个块被继承后可以修改#} <title>Title</title> {% endblock title %} {#结束这个 可以继承的块#} 这个是设置这个模板的title标签的内容可以被继承的时候修改
{{block.super}}
修改的同时把父模板的内容拿下来
这个是你再修改这个模板的同时把你的父亲模板的内容也给拿下来使用
{% extends 'base.html' %} {% block content %} <div class="article_list"> <ul> {% for article in article_list %} <li>{{ article }}</li> {% endfor %} </ul> </div> {% endblock content %} {% block title %} <title>Article</title> {% endblock %} 此次步骤是继承你的base.html内的content块 然后再把base内的这个块的内容给拿过来显示