前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-信息资讯-自定义模板标签

Django实战-信息资讯-自定义模板标签

作者头像
小团子
发布2019-07-18 16:42:36
7530
发布2019-07-18 16:42:36
举报
文章被收录于专栏:数据云团数据云团

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

某些标签(例如:菜单栏、css、JS、以及一些复杂计算后的数据等)需要自定义。然后再在指定的 html 中引用并显示。之所以要用到标签,主要作用就是想让一些内容在多个模板(HTML)中都要有,比如时间格式化。绝对不想在每个视图函数(views中)都写一次这些变量内容。即每个页面都需要用到info,如果每个视图函数都写一次,那真的是非常痛苦,所以使用 Django 的上下文渲染器。

① 时间过滤标签

time 距离现在的时间间隔

1.如果时间间隔小于1分钟以内,那么就显示“刚刚”

2.如果是大于1分钟小于1小时,那么就显示“xx分钟前”

3.如果是大于1小时小于24小时,那么就显示“xx小时前”

4.如果是大于24小时小于30天以内,那么就显示“xx天前”

5.否则就是显示具体的时间 2019/07/02 23:30

代码语言:javascript
复制
from django import template
from datetime import datetime
from django.utils.timezone import now as now_func
from django.utils.timezone import localtime

1、首先在某个 app 中,创建一个python 包,叫做`templatetags`,注意,这个包的名字必须为`templatetags`,不然就找不到。

2、在这个`templatetags`包下面,创建一个 python 文件用来存储过滤器。

3、在新建的python文件中,定义过滤器(也就是函数),这个函数的第一个参数永远是被过滤的那个值,并且如果在使用过滤器的时候传递参数,那么还可以定义另外一个参数。但是过滤器最多只能有2个参数。

4、在写完过滤器(函数)后,要使用`django.template.Library.filter`进行注册。

5、还要把这个过滤器所在的这个app添加到`settings==>INSTALLED_APPS`中,进行安装,不然 Django 也找不到这个过滤器。

6、在模板中使用`load`标签加载过滤器所在的python包。

7、`django.template.Library.filter`还可以当作装饰器来使用。如果`filter`函数没有传递任何参数,那么将会使用这个函数的名字来作为过滤器的名字。当然如果不想使用函数的名字来作为过滤器的名字,也可以传递一个`name`参数。

代码语言:javascript
复制
register = template.Library()
代码语言:javascript
复制
@register.filter
def time_since(value):
    # 清醒的时间
    if not isinstance(value, datetime):
        return value
    # 幼稚的时间now = datetime.now()
    # 清醒的时间
    now = now_func()
    # datetime  距离发表朋友圈有多少秒
    timestamp = (now - value).total_seconds()
    if timestamp < 60:
        return '刚刚'
    elif timestamp >= 60 and timestamp < 60*60 :
        minutes = int(timestamp/60)
        return '%s分钟前' % minutes
    elif timestamp >= 60*60 and timestamp < 60*60*24:
        hours = int(timestamp/60/60)
        return '%s小时前' % hours
    elif timestamp >= 60*60*24 and timestamp < 60*60*24*30:
        days = int(timestamp/60/60/24)
        return '%s天前' % days
    else:
        return value.strftime("%Y/%m/%d %H:%M")
代码语言:javascript
复制

② 前端使用过滤器

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档