Django2.0-templates(5)-自定义过滤器

模板笔记借鉴了知了课堂-Django开发

自定义过滤器

  • 步骤
  1. 自定义的模板过滤器必须放在app中,并且这个app必须要在INSTALLED_APPS中进行安装。

  2. 在这个app下面创建一个python包叫做templatetags这个名字是绝对的

  3. 在这个包下创建一个python文件

    • 如果app的名字为book,项目结构为:

      - book
      	- views.py
      	- urls.py
      	- models.py
      	- templatetags
      		- my_filter.py
      
  4. 在新建的python文件中定义过滤器

  5. 在新建的python文件中注册该过滤器

  6. 在模板中使用load标签加载过滤器所在的python文件名

  • 实例

    • 先在setting.py中的INSTALLED_APPS安装app

      INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          "book", # app名
      ]
      
    • 在app下新建一个名为templatetagspython package,并且在这个包内新建一个python文件

      Django2.0-templates(5)-自定义过滤器_第1张图片

    • 在这个python文件中定义过滤器和注册该过滤器

      # my_filter.py
      
      from django import template
      
      register = template.Library()  # 注册library
      
      #注册方法一 使用装饰器
      @register.filter 
      #默认使用函数名作为过滤器的名字 如果不想,可以使用@register.filter("name")
      def link_str(value, arg):  # 定义过滤器
          return value + arg
      
      #注册方法二
      #register.filter("link_str", link_str)  # 注册过滤器
      
    • 视图函数传递一个上下文

      # views.py
      
      def style_filter(request):
          context = {
              "value": "jack",
          }
          return render(request, "style_filter.html", context=context)
      
    • 模板中使用自定义的过滤器。注意需要用load标签加载自定义过滤器的文件名。

      {# style_filter.html  #}
      {% load my_filter %}  {# 使用load标签加载自定义过滤器的文件名 #}
      
      
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>style_filtertitle>
      head>
      <body>
          <h3>
              {{ value|link_str:"hello" }}
          h3>
      body>
      html>
      
    • 运行

      Django2.0-templates(5)-自定义过滤器_第2张图片

自定义事件计算过滤器

  • 获得一条信息发表的时间。该时间是距离现在多久。比如刚刚, 2小时前等。可以自定义一个过滤器。

  • 实例

    • 在上面的my_filter.py中定义过滤器和注册过滤器

      from django import template
      from datetime import datetime
      register = template.Library()  # 注册library
      
      @register.filter()
      def time_since(value):
          minute = 60
          hour = minute*60
          day = hour*34
          month = day*31
      
          if not isinstance(value, datetime):
              return value
          now = datetime.now()
          # now-value是一个timedelay类型,有一个total_second()方法
          timestamp = (now-value).total_seconds()  # 时间戳
          if timestamp < minute:
              return "刚刚"
          elif minute <= timestamp < hour:  # 简化链式只适合and
              m = int(timestamp/minute)  # py3除法有小数
              return "{}分钟前".format(m)
          elif hour <= timestamp < day:
              h = int(timestamp/hour)
              return "{}小时前".format(h)
          elif day <= timestamp < month:
              d = int(timestamp/day)
              return "{}天前".format(d)
          else:
              return value.strftime("%Y/%m/%d %H:%H")
      
    • urls映射和视图函数

      # urls.py
      
      path('time/', views.time_filter),
      
      # views.py
      
      from datetime import datetime
      
      def time_filter(request):
          context = {
              "value": datetime(year=2018,
                                month=11, day=4, hour=15, minute=0, second=0),
          }
      
          return render(request, "style_filter.html", context=context)
      
    • 模板

      {# style_filter.html  #}
      {% load my_filter %}  {# 使用load标签加载自定义过滤器的文件名 #}
      
      
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>style_filtertitle>
      head>
      <body>
          <h3>
              {{ value|time_since }}
          h3>
      body>
      html>
      
    • 运行

      Django2.0-templates(5)-自定义过滤器_第3张图片

模板标签和模板过滤器查看

from django.template import defaultfilters, defaulttags

你可能感兴趣的:(Django2.0,Django2.0,templates)