Django之模板&静态文件(二)

  • 自定义过滤器
    DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求。因此django提供了一个接口,让开发者能自定义标签和过滤器,使显示达到自己想要的内容或者格式。
  1. 首先,你需要添加一个templatetags的文件夹, 自定义过滤器必须处在已经安装了的app中的一个名叫”templatetags”的包(文件夹)中。因此可以有两种选择:
    1) 一种是放在其他已经安装了的app中。这种方式简单,但不方便管理。
    2)单独创建一个app,用来存放所有的自己定义的过滤器。
    templatetags 文件夹名字不能修改,这是django规定的。
    比如,用pycharm中Tools->Run manage.py Task命令startapp utils创建app,然后再下面建立python包templatetags,pycharm创建文件夹时,不会自动上传所以需要upload到远程服务器上去, 创建完templatetags模块后,重启服务器。
    image.png
  2. 使用自定义过滤器,必须把对应的app加载,在settings中添加该app


    image.png
  3. 在templatetags下添加一个python文件,如我这里创建一个custom.py文件,在文件中添加对应的自定义过滤器
# 过滤器文件中custom.py:
# -*- coding: utf-8 -*-
from django import template
# 将注册类实例化为register对象
# register = template.Library() 创建一个全局register变量,它是用来注册你自定义标签和过滤器的,只有向系统注册过的tags,系统才认得你。
# register 不能做任何修改,一旦修改,该包就无法引用
register = template.Library()
# 使用装饰器注册自定义过滤器
@register.filter
def certificateNoFilter(val, args = 18): #将身份证从倒数第二个反过来6个数替换为*
    # val: 代表管道符左边的参数, 是必须的, 因为自定义过滤器必须使用在变量上,所以必须要
    # args: 可配置的,如果有其它的参数,就代表你需要输入一个值
    return val[:11] + "******" + val[-1]

  1. 将过滤器加载到html, 使用自定义的过滤器
#应用urls.py
url(r'^test/',include('TestApp.urls'))

#应用views.py
# -*- coding: utf-8 -*-
class Custom(View):
    def get(self,request):
        name = '菜鸟突击队'
        certificateno = '430224189009104236'
        #如果不想指定键值,可以使用locals(),locals()指获取当前能获取到的变量,形成一个字典
        return render(request,'custom.html',locals())

#custom.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器</title>
</head>
<body>
姓  名:{{name}}<br/>
身份证:{{ certificateno }}<br/>
用*代替之后的:
{# 加载过滤器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到过滤器文件所在的位置 #}
{% load customFilter %}
{{ certificateno|certificateNoFilter }}
</body>
</html>

效果:
image.png
  • 自定义简单标签
#使用装饰器注册自定义标签
@register.simple_tag
def curr_date(args):#args可传参数,根据实际需求而定
    return datetime.datetime.now().strftime(args)
<h3>自定义标签</h3>
时间日期:{% curr_date "%Y-%m-%d"%}
  • 自定义包含标签
    一种比较普遍的tag类型是只是渲染其它模块显示下内容,这样的类型叫做Inclusion Tag。 常用的模板标签是通过渲染 其他 模板显示数据的。
    我们使用include标签时,如果引入的html代码中需要传入变量,则需要在所引入的view视图中获取变量,如果引入的html代码中的变量是一个公共变量,则需要重复获取N次,使用自定义包含标签,可以在定义文件中获取一次即可
#使用装饰器注册自定义包含标签
@register.inclusion_tag('my_menu.html') #将返回值传给my_menu.html去
def my_menu():
    menus = ['首页','项目实战','每日一练']
    return {'menus':menus}

my_menu.html

<body>
--------------菜单栏--------------
<br/>
{% for menu in menus %}
    {{menu}}
{% endfor %}
</body>
</html>

custom.html

<h3>自定义包含标签</h3>
{% my_menu %}

代码示例:
custom.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器</title>
</head>
<body>
<h3>自定义过滤器</h3>
姓  名:{{name}}<br/>
身份证:{{ certificateno }}<br/>
用*代替之后的:
{# 加载过滤器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到过滤器文件所在的位置 #}
{% load custom %}
{{ certificateno|certificateNoFilter }}
<br/>
<h3>自定义标签</h3>
时间日期:{% curr_date "%Y-%m-%d"%}

<h3>自定义包含标签</h3>
{% my_menu %}
</body>
</html> 

custom.py:

# -*- coding: utf-8 -*-
from django import template
import datetime

# 将注册类实例化为register对象
# register = template.Library() 创建一个全局register变量,它是用来注册你自定义标签和过滤器的,只有向系统注册过的tags,系统才认得你。
# register 不能做任何修改,一旦修改,该包就无法引用
register = template.Library()
# 使用装饰器注册自定义过滤器
@register.filter
def certificateNoFilter(val, args = 18): #将身份证从倒数第二个反过来6个数替换为*
    # val: 代表管道符左边的参数, 该值是必须的, 因为自定义过滤器必须使用在变量上,所以必须要有一个val
    # args: 可配置的,如果有其它的参数,就代表你需要输入一个值
    return val[:11] + "******" + val[-1]

#使用装饰器注册自定义标签
@register.simple_tag
def curr_date(args):#args可传参数,根据实际需求而定
    return datetime.datetime.now().strftime(args)

#使用装饰器注册自定义包含标签
@register.inclusion_tag('my_menu.html') #将返回值传给my_menu.html去
def my_menu():
    menus = ['首页','项目实战','每日一练']
    return {'menus':menus}

views.py:

class Custom(View):
    def get(self,request):
        name = '菜鸟突击队'
        certificateno = '430224189009104236'

        #如果不想指定键值,可以使用locals(),locals()指获取当前能获取到的变量,形成一个字典
        return render(request,'custom.html',locals())

my_menu.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义包含标签</title>
</head>
<body>
--------------菜单栏--------------
<br/>
{% for menu in menus %}
    {{menu}}
{% endfor %}
</body>
</html>

静态文件

  • 模板加载静态文件
  1. 在项目添加一个静态文件夹,并添加需要添加的静态文件(一般名叫static)


    image.png
  2. 将新建立的文件夹引入,配置静态文件settings
STATICFILES_DIRS = [os.path.join(BASE_DIR),'static']

3.页面引入:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src = "{% static '/js/test.js' %}"></script>
    <link type="text/css" rel="stylesheet" href="{% static '/css/test.css' %}"/>
</head>
<body>
<p>
    引入静态文件标签
</p>
</body>
</html>

注意:

  1. 某些应用提供自定义标签和过滤器库. 要在一个模板中访问它们, 使用 {% load %} 标签:
    当你载入一个自定义标签或过滤器库,只有当前模板可以使用这些标签/过滤器 — 继承链中不论是父模板还是子模板都不能使用使用这些标签和过滤器。即哪个页面需要使用,就在哪个页面单独加载,不能通过继承模板方式获得。
  2. 只要templatetags所在位置是settings.py中INSTALLED_APPS中配置过的,或是在TEMPLATE_DIRS配置过的,任意一个位置便可以。
    一定记得要在templatetags文件夹中包含init.py文件。空文件便可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 点我查看本文集的说明及目录。 本项目相关内容( github传送 )包括: 实现过程: CH1 创建一个博客应用 ...
    学以致用123阅读 4,423评论 0 31
  • 版权: https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若与阅读 23,087评论 3 241
  • 那一年因腰腿疼痛,腰椎间盘突出我做了微创手术,事实上当时都是在可做可不做的状态,医生说也可以先保守观察,可是我义无...
    唐惠娟阅读 471评论 0 7
  • 你说,相处不累最重要。 我竟无言以对,好吧,我们不合适。 你说你是不离不弃,但是你现在人呢? 他说,你相信一见钟情...
    若是爱已不可为阅读 85评论 0 1