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
PS:還有比這這個更好的的方法,那就是TM的直接安裝3.9.0的版本,沒辦法國人開發的東西就是垃圾,但是我們除了真香啥都做不了
