一.在app中创建python文件(例如:kings.py)
如图:生成的数据为{"app名":{"表名"userprofileadmin类},实际上就是admin.py中的admin.site.register(models.UserProfile,UserProfileAdmin)注册
from app01 import models #{"app01":{"userprofile"userprofileadmin类} enabled_admins={} #1.创建基类 class BaseAdmin(object): list_display=[] list_filter=[] class UserPorfileAdmin(BaseAdmin): list_display = ["name","user_id"] #model=models.Customer AAA class RoleAdmin(BaseAdmin): list_display = ["name"] ''' register函数相当于admin.site.register() models_class._meta.app_label app名字 models_class._meta.model_name 表名 ''' def register(models_class,admin_class=None): #models_class是表名,admin_class相当于app01.admin中的UserProfileAdmin if models_class._meta.app_label not in enabled_admins: enabled_admins[models_class._meta.app_label]={} admin_class.model=models_class #相当于上AAA===将CustomerAdmin和Customer表关联 enabled_admins[models_class._meta.app_label][models_class._meta.model_name]=admin_class register(models.UserProfile,UserPorfileAdmin) register(models.Role,RoleAdmin)
---------------总urls.py urlpatterns = [ path('admin/', admin.site.urls), path('app01/',include('app01.urls')), path('kingadmin/',include("kingadmin.urls")), ]
----------kingadmin-urls.py from django.urls import path,re_path from kingadmin import views urlpatterns = [ path("",views.tables), re_path("(\w+)/(\w+)",views.tables_info,name="tables_info"), ]
-------kingadmin-views.py from django.shortcuts import render from kingadmin import kings # Create your views here. def tables(request): # print(kings.enabled_admins["app01"]["userprofile"]) return render(request,"kingadmin/tables.html",{"table_list":kings.enabled_admins}) def tables_info(request,app_name,table_name): return render(request,"kingadmin/table_info.html",{"table_list":kings.enabled_admins[app_name][table_name]})
-------tables.html <div class="panel-body"> <div class="bs-example" data-example-id="simple-table"> <table class="table"> {% for app_name,app_tables in table_list.items %} <thead> <tr> <th>{{ app_name }}</th> </tr> </thead> <tbody> {% for table_name,admin in app_tables.items %} <tr> <!--此处url是当前的url:127.0.0.1:8000/kingadmin---> <td><a href="{% url 'tables_info' app_name table_name %}">{% render_table_name admin %}</a></td> <td>add</td> <td>change</td> </tr> {% endfor %} </tbody> {% endfor %} </table> </div> </div>
--------tables_info.html
{%load "tags"%} <div class="bs-example" data-example-id="simple-table"> <table class="table"> <thead> <tr> {% for filed in table_list.list_display %} <!---tabel_list是userprofileadmin类--> <td>{{ filed }}</td> <!--filed是字符串形式---> {% endfor %} </tr> </thead> <tbody> {% render_table_filed_value table_list as t%} <!--这是返回的表中所有数据--> {% for i in t %} <!--i为每一行的对象---> <tr> {% table_filed_value i table_list as f%} <!--每行得到的数据--> {{ f }} </tr> {% endfor %} </tbody> </table> </div> </div>
-------tags.py from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.simple_tag def render_table_name(admin_class): #返回表名(中文) return admin_class.model._meta.verbose_name @register.simple_tag def render_table_filed_value(admin_class): #返回从models表中查询得到的数据 data=admin_class.model.objects.all() return data @register.simple_tag def table_filed_value(obj,admin_class): fil_datas="" for data in admin_class.list_display: get_data=getattr(obj,data) fil_datas+="<td>%s</td>"%(get_data) return mark_safe(fil_datas)