1:创建  templatetags文件夹

2:创建simpletags.py文件将内容粘贴进去,在下面

3:setting.py添加文件指定:

 1 TEMPLATES = [
2 {
3 'BACKEND': 'django.template.backends.django.DjangoTemplates',
4 'DIRS': [BASE_DIR+"/templates", ],
5 'APP_DIRS': True,
6 'OPTIONS': {
7 'context_processors': [
8 'django.template.context_processors.debug',
9 'django.template.context_processors.request',
10 'django.contrib.auth.context_processors.auth',
11 'django.contrib.messages.context_processors.messages',
12 ],
13 'libraries': {
14 'simpleui': 'simpleui.templatetags.simpletags', # 添加位置
15 }
16 },
17 },
18 ]
# simpletags.py

import base64
import json
import os
import platform
import sys
import time import django
import simpleui
from django import template from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
from django.urls import reverse
from django.utils.encoding import force_text
from django.utils.functional import Promise
from django.utils.html import format_html
from django.utils.safestring import mark_safe register = template.Library() PY_VER = sys.version[0] # 2 or 3
from django.utils.translation import gettext_lazy as _ if PY_VER != '2':
from importlib import reload def unicode_to_str(u, encoding='utf-8'):
if PY_VER != '2':
return u
return u.encode(encoding) class LazyEncoder(DjangoJSONEncoder):
"""
解决json __proxy__ 问题
""" def default(self, obj):
if isinstance(obj, Promise):
return force_text(obj)
return super(LazyEncoder, self).default(obj) @register.simple_tag(takes_context=True)
def context_test(context):
print(context)
pass # context.get('cl').filter_specs[1].links
@register.simple_tag(takes_context=True)
def load_dates(context):
data = {}
cl = context.get('cl')
if cl.has_filters:
for spec in cl.filter_specs:
# 自定义的filter,没有field
if not hasattr(spec, 'field'):
continue field = spec.field
field_type = None
if isinstance(field, models.DateTimeField):
field_type = 'datetime'
elif isinstance(field, models.DateField):
field_type = 'date'
elif isinstance(field, models.TimeField):
field_type = 'time' if field_type:
data[spec.field_path] = field_type
context['date_field'] = data return '<script type="text/javascript">var searchDates={}</script>'.format(json.dumps(data, cls=LazyEncoder)) @register.filter
def has_filter(spec):
return hasattr(spec, 'parameter_name') @register.filter
def get_date_type(spec):
field = spec.field
field_type = ''
if isinstance(field, models.DateTimeField):
field_type = 'datetime'
elif isinstance(field, models.DateField):
field_type = 'date'
elif isinstance(field, models.TimeField):
field_type = 'time' return field_type @register.filter
def test(obj):
print(obj)
# pass
return '' @register.filter
def to_str(obj):
return str(obj) @register.filter
def date_to_json(obj):
return json.dumps(obj.date_params, cls=LazyEncoder) @register.simple_tag(takes_context=True)
def home_page(context):
'''
处理首页,通过设置判断打开的是默认页还是自定义的页面
:return:
'''
home = __get_config('SIMPLEUI_HOME_PAGE')
if home:
context['home'] = home title = __get_config('SIMPLEUI_HOME_TITLE')
if not title:
title = '首页' icon = __get_config('SIMPLEUI_HOME_ICON')
if not icon:
icon = 'el-icon-menu' context['title'] = title
context['icon'] = icon return '' def __get_config(name):
from django.conf import settings
value = os.environ.get(name, getattr(settings, name, None)) return value @register.filter
def get_config(key):
return __get_config(key) @register.simple_tag
def get_version():
return simpleui.get_version() @register.simple_tag
def get_app_info():
return format_table({"version": simpleui.get_version()}) def format_table(d):
html = '<table class="simpleui-table"><tbody>'
for key in d:
html += '<tr><th>{}</th><td>{}</td></tr>'.format(key, d.get(key))
html += '</tbody></table>'
return format_html(html) @register.simple_tag(takes_context=True)
def menus(context, _get_config=None):
data = [] # return request.user.has_perm("%s.%s" % (opts.app_label, codename))
if not _get_config:
_get_config = get_config config = _get_config('SIMPLEUI_CONFIG')
if not config:
config = {} if config.get('dynamic', False) is True:
config = _import_reload(_get_config('DJANGO_SETTINGS_MODULE')).SIMPLEUI_CONFIG app_list = context.get('app_list')
for app in app_list:
_models = [
{
'name': m.get('name'),
'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name'))),
'url': m.get('admin_url'),
'addUrl': m.get('add_url'),
'breadcrumbs': [{
'name': app.get('name'),
'icon': get_icon(app.get('app_label'), app.get('name'))
}, {
'name': m.get('name'),
'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name')))
}]
} for m in app.get('models')
] if app.get('models') else [] module = {
'name': app.get('name'),
'icon': get_icon(app.get('app_label'), app.get('name')),
'models': _models
}
data.append(module) # 如果有menu 就读取,没有就调用系统的
key = 'system_keep'
if config and 'menus' in config:
if config.get(key, None):
temp = config.get('menus')
for i in temp:
# 处理面包屑
if 'models' in i:
for k in i.get('models'):
k['breadcrumbs'] = [{
'name': i.get('name'),
'icon': i.get('icon')
}, {
'name': k.get('name'),
'icon': k.get('icon')
}]
else:
i['breadcrumbs'] = [{
'name': i.get('name'),
'icon': i.get('icon')
}]
data.append(i)
else:
data = config.get('menus') # 获取侧边栏排序, 如果设置了就按照设置的内容排序, 留空则表示默认排序以及全部显示
if config.get('menu_display') is not None:
display_data = list()
for _app in data:
if _app['name'] not in config.get('menu_display'):
continue
_app['_weight'] = config.get('menu_display').index(_app['name'])
display_data.append(_app)
display_data.sort(key=lambda x: x['_weight'])
data = display_data # 给每个菜单增加一个唯一标识,用于tab页判断
eid = 1000
for i in data:
eid += 1
i['eid'] = eid
if 'models' in i:
for k in i.get('models'):
eid += 1
k['eid'] = eid return '<script type="text/javascript">var menus={}</script>'.format(json.dumps(data, cls=LazyEncoder)) def get_icon(obj, name=None):
temp = get_config_icon(name)
if temp != '':
return temp _dict = {
'auth': 'fas fa-shield-alt',
'User': 'far fa-user',
'Group': 'fas fa-users-cog'
}
temp = _dict.get(obj)
if not temp:
_default = __get_config('SIMPLEUI_DEFAULT_ICON')
if _default is None or _default:
return 'far fa-circle'
return ''
return temp # 从配置中读取图标
def get_config_icon(name):
_config_icon = __get_config('SIMPLEUI_ICON')
if _config_icon is None:
return '' if name in _config_icon:
return _config_icon.get(name)
return '' @register.simple_tag(takes_context=True)
def load_message(context):
messages = context.get('messages')
array = [dict(msg=msg.message, tag=msg.tags) for msg in messages] if messages else [] return '<script id="out_message" type="text/javascript">var messages={}</script>'.format(
json.dumps(array, cls=LazyEncoder)) @register.simple_tag(takes_context=True)
def context_to_json(context):
json_str = '{}' return mark_safe(json_str) @register.simple_tag()
def get_language():
from django.conf import settings
return settings.LANGUAGE_CODE.lower() @register.filter
def get_language_code(val):
from django.conf import settings
return settings.LANGUAGE_CODE.lower() def get_analysis_config():
val = __get_config('SIMPLEUI_ANALYSIS')
if val:
return True
return False @register.simple_tag(takes_context=True)
def load_analysis(context):
try:
if not get_analysis_config():
return '' # 理论上值一天只上报一次
key = 'simpleui_' + time.strftime('%Y%m%d', time.localtime()) if key in context.request.session:
return '' b64 = ""
j = {
"n": platform.node(),
"o": platform.platform(),
"p": platform.python_version(),
"d": django.get_version(),
"s": simpleui.get_version(),
}
if 'theme_name' in context.request.COOKIES:
j['t'] = context.request.COOKIES['theme_name']
else:
j['t'] = 'Default' b64 = base64.b64encode(str(j).encode('utf-8')) url = '//simpleui.88cto.com/analysis'
b64 = b64.decode('utf-8')
html = '<script async type="text/javascript" src="{}/{}"></script>'.format(url, b64);
context.request.session[key] = True return mark_safe(html)
except:
return '' @register.simple_tag(takes_context=True)
def custom_button(context):
admin = context.get('cl').model_admin
data = {}
actions = admin.get_actions(context.request)
# if hasattr(admin, 'actions'):
# actions = admin.actions
# 输出自定义按钮的属性 if actions:
i = 0
for name in actions:
values = {}
fun = actions.get(name)[0]
for key, v in fun.__dict__.items():
if key != '__len__' and key != '__wrapped__':
values[key] = v
values['eid'] = i
i += 1
data[name] = values return json.dumps(data, cls=LazyEncoder) from django.db.models.fields.related import ForeignKey def get_model_fields(model, base=None):
field_list = []
fields = model._meta.fields
for f in fields:
label = f.name
if hasattr(f, 'verbose_name'):
label = getattr(f, 'verbose_name') if isinstance(label, Promise):
label = str(label) if base:
field_list.append(('{}__{}'.format(base, f.name), label))
else:
field_list.append((f.name, label)) return field_list @register.simple_tag(takes_context=True)
def search_placeholder(context):
cl = context.get('cl') # 取消递归,只获取2级
fields = get_model_fields(cl.model) for f in cl.model._meta.fields:
if isinstance(f, ForeignKey):
fields.extend(get_model_fields(f.related_model, f.name)) verboses = [] for s in cl.search_fields:
for f in fields:
if f[0] == s:
verboses.append(f[1])
break return ",".join(verboses) def _import_reload(_modules):
_obj = __import__(_modules, fromlist=_modules.split('.'))
reload(_obj)
return _obj @register.simple_tag
def get_tz_suffix():
# 判断settings.py中的TZ是否为false
tz = __get_config('USE_TZ')
# 必须明确指定为True的时候,才返回+8 的后缀
if tz:
return '+08:00'
return '' @register.simple_tag
def simple_version():
return simpleui.get_version() @register.simple_tag(takes_context=True)
def get_model_url(context):
# reverse()
opts = context.get('opts')
key = 'admin:{}_{}_changelist'.format(opts.app_label, opts.model_name)
return reverse(key) @register.simple_tag
def has_enable_admindoc():
from django.conf import settings
apps = settings.INSTALLED_APPS
return 'django.contrib.admindocs' in apps @register.simple_tag(takes_context=True)
def has_admindoc_page(context):
if hasattr(context, 'template_name'):
return context.template_name.find('admin_doc') == 0
return False @register.simple_tag
def get_boolean_choices():
return (
('True', _('Yes')),
('False', _('No'))
) @register.simple_tag(takes_context=True)
def get_previous_url(context):
return context.request.META.get('HTTP_REFERER') if __name__ == "__main__":
pass

【django-simpleui】‘simpletags‘ is not a registered tag library报错的解决方法的更多相关文章

  1. django正常运行确报错的解决方法

    django正常运行却报错的处理方法 出处 : https://www.infvie.com/ops-notes/django-normal-operation-error 报错一:self._soc ...

  2. django报错信息解决方法

    You have 17 unapplied migration(s). Your project may not work properly until you apply the migration ...

  3. Django+python报错与解决方法

    编码信息导致修改django文件下的debug.py文件331行的编码格式 with Path(CURRENT_DIR, 'templates', 'technical_500.html').open ...

  4. django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library.

    django.template.exceptions.TemplateSyntaxError: 'article_tags' is not a registered tag library. Must ...

  5. django.template.exceptions.TemplateSyntaxError: 'static' is not a registered tag library. Must be one of:

    在访问web页面时报错,详细日志如下: django.template.exceptions.TemplateSyntaxError: 'staticfiles' is not a registere ...

  6. 关于'selffilter' is not a registered tag library. Must be one of:

    报错代码: 'selffilter' is not a registered tag library. Must be one of: admin_list admin_modify admin_st ...

  7. Django 自定义模板标签 报错django.template.exceptions.TemplateSyntaxError: '####' is not a registered tag library. Must be one of:

    我写代码遇到这个错误,但是发现程序没有写错,好像是程序有缓存,重新运行几次就好了. 自定义模板标签,可以不用写views,url直接通过自定义函数把变量传给模板. 具体实现: 1.在app下新建Pyt ...

  8. 08:'my_tag' is not a registered tag library. Must be one of

    确保每次修改模板标签时都重新启动 Django 开发服务器(或确保它自己重新启动).如果服务器没有重新启动,Django 将不会注册标签. 从 django 1.9 开始,您可以在如下设置中加载这些新 ...

  9. Django | 模型类变更后生成迁移文件,报错:You are trying to add a non-nullable field 'BookName' to BookInfo without a default....

    报错: You are trying to add a non-nullable field 'BookName' to BookInfo without a default; we can't do ...

随机推荐

  1. Spring一些笔记

    @ControllerAdvice ,被注解的class表示这是一个增强的 Controller. 使用这个 Controller ,可以实现三个方面的功能: 全局异常处理 全局数据绑定 全局数据预处 ...

  2. react-router 路由切换动画

    路由切换动画 因为项目的需求,需要在路由切换的时候,加入一些比较 zb 的视觉效果,所以研究了一下.把这些学习的过程记录下来,以便以后回顾.同时也希望这些内容能够帮助一些跟我一样的菜鸟,让他们少走些坑 ...

  3. vue+less换肤,主题切换方案

    新的项目对于客户自定义要求很高,然后换肤是其中一个很小的模块,经过了一段时间的摸索,看了许多文章,找到了几种方案. https://www.cnblogs.com/leiting/p/11203383 ...

  4. sqlserver date与datetime区别及sqlserver日期格式转换

    date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间.DateTime 日期 ...

  5. 依赖注入在 dotnet core 中实现与使用:4. 集成 Autofac

    本示例使用 .net core 5 rc-1 实现. 1. 添加 Nuget 包引用 使用 Autofac 当然要添加 Autofac 的 Nuget 包,主要涉及到两个: Autofac.Exten ...

  6. Python练习题 034:Project Euler 006:和平方与平方和之差

    本题来自 Project Euler 第6题:https://projecteuler.net/problem=6 # Project Euler: Problem 6: Sum square dif ...

  7. python程序整理(2)

    # 写一个函数完成三次登陆功能: # 用户的用户名密码从一个文件register中取出. # register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行. # 完 ...

  8. 超简单的CDH6部署和体验(单机版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. thinkpad怎么设置u盘启动

    1.按下笔记本的开机键,当屏幕出现"Press F1 for ThinkPad BIOS Setup Utility"提示时,迅速按下f1键,此时系统就自动进入到ThinkPad的 ...

  10. 第二十四章 IPtables防火墙

    一.iptables防火墙基本概述 1.应用场景 1.主机安全2.端口转发/ip转发3.内部共享上网 2.iptables工作流程 1.配置防火墙规则可以添加在下面,也可以添加在前面,是有顺序的2.匹 ...