博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python学习-Django (2)
阅读量:7014 次
发布时间:2019-06-28

本文共 2859 字,大约阅读时间需要 9 分钟。

自定义标签和过滤器

1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

2、在app中创建templatetags模块(模块名只能是templatetags)

3、创建任意 .py 文件,如:my_tags.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from 
django 
import 
template
from 
django.utils.safestring 
import 
mark_safe
 
register 
= 
template.Library()   
#register的名字是固定的,不可改变
 
 
@register
.
filter
def 
filter_multi(v1,v2):
    
return  
v1 
* 
v2
<br>
@register
.simple_tag
def 
simple_tag_multi(v1,v2):
    
return  
v1 
* 
v2
<br>
@register
.simple_tag
def 
my_input(
id
,arg):
    
result 
= 
"<input type='text' id='%s' class='%s' />" 
%
(
id
,arg,)
    
return 
mark_safe(result)

4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

1
{
% 
load my_tags 
%
} 

5、使用simple_tag和filter(如何调用)

1
2
3
4
5
6
7
8
9
10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
.html
{
% 
load xxx 
%
}  
      
# num=12
{
{ num|filter_multi:
2 
}} 
#24
 
{
{ num|filter_multi:
"[22,333,4444]" 
}}
 
{
% 
simple_tag_multi 
2 
5 
%
}  参数不限,但不能放在
if 
for
语句中
{
% 
simple_tag_multi num 
5 
%
}

注意:filter可以用在if等语句后,simple_tag不可以

模板继承 (extend)

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

通过从下面这个例子开始,可以容易的理解模版继承:

    
{% block title %}My amazing site{%/span> endblock %}
{% block content %}{% endblock %}

这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。

在这个例子中, block 标签定义了三个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。

子模版可能看起来是这样的:

extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:

请注意,子模版并没有定义 sidebar block,所以系统使用了父模版中的值。父模版的 {% block %} 标签中的内容总是被用作备选内容(fallback)。

 

这种方式使代码得到最大程度的复用,并且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。

这里是使用继承的一些提示:

  • 如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。

  • 在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。

  • 如果你发现你自己在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 {% block %} 中。

  • If you need to get the content of the block from the parent template, the {

    { block.super }} variable will do the trick. This is useful if you want to add to the contents of a parent block instead of completely overriding it. Data inserted using {
    { block.super }}
     will not be automatically escaped (see the next section), since it was already escaped, if necessary, in the parent template.

  • 为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:

    1
    2
    3
    {
    % 
    block content 
    %
    }
    ...
    {
    % 
    endblock content 
    %
    }  

    在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。

最后,请注意您并不能在一个模版中定义多个相同名字的 block 标签。这个限制的存在是因为block标签的作用是“双向”的。这个意思是,block标签不仅提供了一个坑去填,它还在 _父模版_中定义了填坑的内容。如果在一个模版中有两个名字一样的 block 标签,模版的父模版将不知道使用哪个block的内容。

转载于:https://www.cnblogs.com/ikere/p/7838312.html

你可能感兴趣的文章
java.lang.IllegalArgumentException: No enum constant org.apache.ws.commons.schema.XmlSchemaForm.
查看>>
解读90后关键词 新生的红利市场在哪?
查看>>
SQL Server实际执行计划COST"欺骗"案例
查看>>
在EF Core里面如何使用以前EntityFramework的DbContext.Database.SqlQuery<SomeModel>自定义查询...
查看>>
Android Camera2 参数调节关键字翻译集合,常用关键字解析
查看>>
docker的使用
查看>>
【转】OPPO A77保持应用后台运行方法
查看>>
Linux下*.tar.gz文件解压缩命令
查看>>
京都之行
查看>>
枚举NT系统用户
查看>>
任务,过程,和线程
查看>>
(原創) 令人期待的C# 3.0/LINQ (.NET) (C#)
查看>>
delphi 通过线程实现Windows服务
查看>>
育儿:自制身高仪和照片墙
查看>>
QT槽和信号机制介绍
查看>>
[例程]string.trim().length()的用法
查看>>
电子书下载:Microsoft Windows Identity Foundation Cookbook
查看>>
ORACLE修改表空间方法
查看>>
敏捷本质:价值驱动、拥抱变化
查看>>
TOGAF:企业信息化复杂吗?
查看>>