在Django中自定义filter并在template中的使用详解


Posted in Python onMay 19, 2020

Django内置的filter有很多,然而我们由于业务逻辑的特殊要求,有时候仍然会不够用,这个时候就需要我们自定义filter来实现相应的内容。接下来让我们从自定义一个get_range(value)来产生列表的filter开始吧。

首先在你的django app的models.py的同级目录建立一个templatetags的文件夹,并在里面新建一个init.py的空文件,这个文件确保了这个文件夹被当做一个python的包。在添加了templatetags模块之后,我们需要重新启动服务器才能使其有效。

polls/
  __init__.py
  models.py
  templatetags/
    __init__.py
  views.py

然后在templatetags中新建一个python文件,文件名就是以后需要加载到页面的自定义库的名字。在这里我们新建一个generalfilters.py文件。

polls/
  __init__.py
  models.py
  templatetags/
    __init__.py
    generalfilters.py
  views.py

为了让库生效,必须在文件里添加一个模块级别的register变量。它是template.Library的实例,确保了标签和过滤器的有效性。

编辑generalfilters.py,添加

from django import template
register=template.Library()
@register.filter
def get_range(value):
  return range(value)

上述代码中定义了一个生成列表的函数,@register.filter表示这个函数是一个过滤器。至此我们的生成列表的过滤器就已经写好了。接下来我们需要把这个过滤器的库加载到模板里。

在你想要使用的模板的顶部加上{% load generalfilters %},就可以使用这个过滤器了。

{% for i in 5|get_range_bet_within %}
  {{i}}
{% endfor %}

运行结果

在Django中自定义filter并在template中的使用详解

补充知识:Django 自定义筛选器:重写DateFieldListFilter

我就废话不多说了,大家还是直接看代码吧!

class MyDateTimeFilter(admin.filters.DateFieldListFilter):
  def __init__(self, *args, **kwargs):
    super(MyDateTimeFilter, self).__init__(*args, **kwargs)
 
    now = timezone.now()
    # When time zone support is enabled, convert "now" to the user's time
    # zone so Django's definition of "Today" matches what the user expects.
    if timezone.is_aware(now):
      now = timezone.localtime(now)
 
    filter_end_date = now.replace(hour=0, minute=0, second=0, microsecond=0)
 
    filter_start_date_for_one_week = filter_end_date - datetime.timedelta(days=7)
 
    month_with_day31 = [1,3,5,7,8,10,12]
    if filter_end_date.month in month_with_day31 and filter_end_date.day == 31 and filter_end_date.month != 3:
      if filter_end_date.month == 1:
        filter_start_date_for_one_month = filter_end_date.replace(year=filter_end_date.year-1, month=12)
      else:
        filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=30)
    elif filter_end_date.month == 3 and filter_end_date.day in [29, 30, 31]:
      if is_leap_year(filter_end_date.year):
        filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=29)
      else:
        filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1, day=28)
    else:
      if filter_end_date.month == 1:
        filter_start_date_for_one_month = filter_end_date.replace(year=filter_end_date.year-1, month=12)
      else:
        filter_start_date_for_one_month = filter_end_date.replace(month=filter_end_date.month-1)
    
    filter_start_date_for_six_month = ''
    filter_start_date_for_six_month_month = (filter_end_date.month - 6 + 12) % 12
    if filter_start_date_for_six_month_month == 0:
      filter_start_date_for_six_month_month = 12
    if filter_start_date_for_six_month_month in month_with_day31:
      if filter_end_date.month > 6:
        filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
      else:
        filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month)
    elif filter_start_date_for_six_month_month == 2:
      if filter_end_date.day in [29, 30, 31]:
        if is_leap_year(filter_end_date.year):
          filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=29)
        else:
          filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=28)
      else:
        filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
    else:
      if filter_end_date.day == 31 and filter_end_date.month >6:
        filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month, day=30)
      elif filter_end_date.day == 31 and filter_end_date.month <=6:
        filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month, day=30)
      elif filter_end_date.day <31 and filter_end_date.month >6:
        filter_start_date_for_six_month = filter_end_date.replace(month=filter_start_date_for_six_month_month)
      else:
        filter_start_date_for_six_month = filter_end_date.replace(year=filter_end_date.year-1, month=filter_start_date_for_six_month_month)
 
    filter_end_date = filter_end_date + datetime.timedelta(days=1)
 
    self.links = ((
      ('------', {}),
      ('Past week', {
        self.lookup_kwarg_since: str(filter_start_date_for_one_week),
        self.lookup_kwarg_until: str(filter_end_date),
      }),
      ('Past month', {
        self.lookup_kwarg_since: str(filter_start_date_for_one_month),
        self.lookup_kwarg_until: str(filter_end_date),
      }),
      ('Past 6 months', {
        self.lookup_kwarg_since: str(filter_start_date_for_six_month),
        self.lookup_kwarg_until: str(filter_end_date),
      }),
      ('All', {}),
    ))

以上这篇在Django中自定义filter并在template中的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python制作最美应用的爬虫
Oct 28 Python
python+opencv轮廓检测代码解析
Jan 05 Python
Python request设置HTTPS代理代码解析
Feb 12 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
python提取包含关键字的整行数据方法
Dec 11 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
python输出数学符号实例
May 11 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
Jun 30 Python
常用的10个Python实用小技巧
Aug 10 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
Django Model中字段(field)的各种选项说明
May 19 #Python
Django模板获取field的verbose_name实例
May 19 #Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 #Python
django ORM之values和annotate使用详解
May 19 #Python
基于python实现地址和经纬度转换
May 19 #Python
Python Django form 组件动态从数据库取choices数据实例
May 19 #Python
Django自关联实现多级联动查询实例
May 19 #Python
You might like
php中数组首字符过滤功能代码
2012/07/31 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python爬取三国演义的实现方法
2016/09/12 Python
Numpy array数据的增、删、改、查实例
2018/06/04 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
介绍一下EJB的体系结构
2012/08/01 面试题
数控技术应届生求职信
2013/11/13 职场文书
机电一体化专业推荐信
2013/12/03 职场文书
手机被没收检讨书
2014/02/22 职场文书
法定代表人授权委托书
2014/04/04 职场文书
单位在职证明书
2014/09/11 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL