天天看點

[Django]報錯:TemplateSyntaxError at xxx is not a registered tag library. Must be one of admin_lis...解決

報錯資訊如下: 

[Django]報錯:TemplateSyntaxError at xxx is not a registered tag library. Must be one of admin_lis...解決

出現這個問題應該是自定義模闆的标簽和過濾器時出錯的。

下面來說一下簡要的需要注意的幾點,可以根據自己的代碼進行修改:

  • 自定義的 tags 和 filters 會儲存在子產品名為 

    templatetags

     的目錄内。
    • 子產品檔案的名字即稍候你用來加載 tags 的名字,是以小心不要采用一個可能與其它應用自定義的 tags 和 filters 沖突的名字。
  • 要成為一個可用的 tag 庫,子產品必須包含一個名為 

    register

     的子產品級變量,它是一個 

    template.Library

     執行個體。
    • 所有的 tags 和 filters 均在其中注冊。是以,在子產品的開始,輸入以下内容:
    • from django import template
      
      register = template.Library()
                 
  • {% load 标簽檔案名 %}來使用标簽

例:

[Django]報錯:TemplateSyntaxError at xxx is not a registered tag library. Must be one of admin_lis...解決

mytag.py内容如下: 

import datetime

from django import template

#建立一個模闆對象
register = template.Library()
@register.filter(name='sub1')#這個name是在模闆中調用時用到的
def sub(value): #這參數不能多于兩個
    return value - 1

@register.filter(name='days_ago')
def time_ago(value):
    '''
    定義一個距離目前時間多久前的過濾器
    :param value:
    :return:
    1、如果時間間隔一分鐘前,顯示剛剛
    2、如果時間間隔大于1分鐘小于1小時,顯示xx分鐘前
    3、如果時間間隔大于1小時小于24小時,顯示xx小時前
    4、如果時間間隔大于24小時小于30天,顯示xx天前
    5、如果時間間隔大于30天,顯示具體時間
    '''

    if not isinstance(value, datetime.datetime):
        return value
    now = datetime.datetime.now()
    timestamp = (now - value).total_seconds()
    if timestamp < 60:
        return '剛剛'
    elif timestamp >= 60 and timestamp < 60 * 60:
        return '{}分鐘前'.format(int(timestamp / 60))
    elif timestamp >= 60*60 and timestamp < 60*60*24:
        return '{}小時前'.format(timestamp/60/60)
    elif timestamp >= 60*60*24 and timestamp < 60*60*23*30:
        return '{}天前'.format(int(timestamp/60/60/24))
    else:
        return value.strftime('%Y-%m-%d %H:%M')
           

更多可以檢視django官方文檔:https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/