adminLTE的自動化菜單


一.
  model
  
 1 from django.db import models
 2 
 3 
 4 # Create your models here.
 5 class MenuInfo(models.Model):
 6     parent = models.ForeignKey('MenuInfo', blank=True, null=True)
 7     name = models.CharField('菜單名稱', max_length=15)
 8     menu_icon = models.ForeignKey('IconInfo', verbose_name='圖標')
 9     url = models.CharField('網址', max_length=100, blank=True, null=True)
10     show = models.BooleanField('是否顯示', default=False)
11     priority = models.IntegerField(verbose_name=u'顯示優先級', null=True, blank=True, default=-1)
12 
13     class Meta:
14         db_table = 'MenuInfo'
15 
16 
17 class IconInfo(models.Model):
18     DisplayName = models.CharField(max_length=100)
19     ClassName = models.CharField(max_length=100)
20     SourceType = models.CharField(max_length=100)
21     CreateTime = models.DateTimeField(auto_created=True)
22 
23     class Meta:
24         db_table = 'IconInfo'
model的代碼

二.

  模板中間件

  1.setting的設置

 1 TEMPLATES = [
 2     {
 3         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 4         'DIRS': [os.path.join(BASE_DIR, 'templates')]
 5         ,
 6         'APP_DIRS': True,
 7         'OPTIONS': {
 8             'context_processors': [
 9                 'django.template.context_processors.debug',
10                 'django.template.context_processors.request',
11                 'django.contrib.auth.context_processors.auth',
12                 'django.contrib.messages.context_processors.messages',
13                 'adminLTE.context_processors.make_menus_processor',
14             ],
15             'builtins': [                                     # Add this section
16                 "debugtools.templatetags.debugtools_tags",   # Add this line
17             ],
18         },
19     },
20 ]
setting的設置

  2.中間件的代碼
  2.1設置了一個全局變量,這樣方便設置菜單的active的選中狀態

 1 from django.utils.html import format_html
 2 from menuInfo.models import MenuInfo
 3 
 4 menu_active = ''
 5 
 6 def make_menus_html(menus, parent_id=None, current_parent_id=None, active=None):
 7     """
 8     menus = Menus.objects.all()
 9     :param menus: 尋找的對象,傳一個queryset對象
10     :param parent_id: 父級菜單ID
11     :param current_parent_id: 當前父級菜單ID
12     :param active: 激活的菜單名
13     :return:
14     """
15     make_html = ""
16     for menu in menus:
17         child_menu_flag = "treeview"
18         menu_right_flag = '<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>'
19         child_menu = '<li class="{active}"><a href="{menu_url}"><i class="fa fa-circle-o"></i> {menu_name}</a></li>'
20         child_menu_html = '<ul class="treeview-menu">{make_child_menu_html}</ul>'
21         master_menu_html = """
22         <li class="{child_menu_flag} {active}">
23             <a href="{menu_url}"><i class="fa {menu_icon}"></i> <span>{menu_name}</span>{menu_right_flag}</a>
24             <ul class="treeview-menu">
25             {children_menu_html}
26             </ul>
27         </li>"""
28         children_menu_html = """
29         <li class="treeview">
30             <a href="{menu_url}"><i class="fa fa-circle-o"></i> <span>{menu_name}</span>{menu_right_flag}</a>
31             {child_menu_html}
32         </li>"""
33         parent = menu.parent  # 獲取當前菜單的父級菜單
34         if current_parent_id == menu.id or (not parent and current_parent_id):
35             continue  # 如果當前父級菜單ID是自己或沒有父級菜單且有當前父級ID則跳過本次循環
36         if not parent and current_parent_id is None:  # 如果沒有父級菜單且當前父級ID是None
37             make_children_menu_html = make_menus_html(menus, parent_id=parent_id, current_parent_id=menu.id)
38             if not make_children_menu_html:
39                 menu_right_flag = ''
40             menu_icon = menu.menu_icon.ClassName
41             if hasattr(menu, 'icon_name'):
42                 menu_icon = menu.icon_name
43             active = menu_active.split('/')[1]
44             active = '/%s/' % active
45             if menu.url == active:
46                 active_menu = 'active'
47             else:
48                 active_menu = ''
49             make_master_menu_html = master_menu_html.format(child_menu_flag=child_menu_flag,
50                                                             active=active_menu,
51                                                             menu_url=menu.url,
52                                                             menu_icon=menu_icon,
53                                                             menu_name=menu.name,
54                                                             menu_right_flag=menu_right_flag,
55                                                             children_menu_html=make_children_menu_html)
56             make_html += make_master_menu_html
57         elif parent and current_parent_id == parent.id:  # 如果有父級且當前父級ID是自己的父級ID4
58             make_child_menu_html = make_menus_html(menus, parent_id=current_parent_id, current_parent_id=menu.id)
59             if make_child_menu_html:
60                 child_menu_html = child_menu_html.format(make_child_menu_html=make_child_menu_html)
61                 children_menu_html = children_menu_html.format(menu_url=menu.url,
62                                                                menu_name=menu.name,
63                                                                menu_right_flag=menu_right_flag,
64                                                                child_menu_html=child_menu_html)
65             else:
66                 if menu.url == menu_active:
67                     active_menu = 'active'
68                 else:
69                     active_menu = ''
70                 children_menu_html = child_menu.format(menu_url=menu.url, menu_name=menu.name, active=active_menu)
71             make_html += children_menu_html
72         else:
73             continue
74     return make_html
75 
76 
77 def make_menus_processor(request):
78     menus_obj = MenuInfo.objects.filter(show=0)
79     global menu_active
80     menu_active = request.path
81     menus = make_menus_html(menus=menus_obj, active=menu_active)
82     return {'menus': format_html(menus)}
模板中間件代碼

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM