先新建Zadmin的app
最先注册此app
'Zdmin.apps.ZadminConfig',
'app01.apps.App01Config',
编写!!!ModelZadmin和ZadminSite
在Zadmin(app)里面编写Zadmin.py
from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect, render
class XadminSite(object):
def __init__(self):
self._registry = {}
# 将表model作为参数传入admin_class
def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelZadmin
# 此时self为单例对象site
self._registry[model] = admin_class(model,self)
# 可以通过访问属性方式执行下面函数
@property
def urls(self):
return self.get_urls(), None, None
def get_urls(self):
temp = []
# model为表,admin_class_obj为ModelZadmin的对象
for model, admin_class_obj in self._registry.items():
# app的name
app_name = model._meta.app_label
# 表名
model_name = model._meta.model_name
#拼接出地址
temp.append(url(r'^{0}/{1}/'.format(app_name, model_name),admin_class_obj.urls2))
return temp
# 单例对象
site = ZadminSite()
class ModelZadmin(object):
list_display = ['__str__']
def __init__(self, model, site):
self.model = model
self.site = site
@property
def urls2(self):
# url分发的方式
return self.get_urls2(), None, None
def get_urls2(self):
temp = []
temp.append(url(r'^$',self.list_view))
temp.append(url(r'^add/$',self.add_view))
temp.append(url(r'^(\d+)/change/$',self.change_view))
temp.append(url(r'^(\d+)/delete/$',self.delete_view))
return temp
def list_view(self, request):
model_name = self.model._meta.model_name
data_list = self.model.objects.all()
# 处理表头
header_list = []
# 显示的字段
for field in self.list_display:
# 如果是字符串
if isinstance(field,str):
# 初始未赋值时
if field == "__str__":
val = model_name.upper()
else:
# 获取到字段对象
field_obj = self.model._meta.get_field(field)
val = field_obj.verbose_name
else:
# 执行函数,传入参数self, is_header=True
val = field(self, is_header=True)
header_list.append(val)
# 处理表单显示数据
new_data_list = []
for obj in data_list:
temp = []
for field in self.list_display:
# 字符串即可直接获取对象obj的属性值
if isinstance(field,str):
val = getattr(obj,field)
# 函数既是执行函数
else:
val = field(self, obj)
temp.append(val)
new_data_list.append(temp)
return render(request, 'list_view.html',{"new_data_list": new_data_list,"model_name":model_name,"header_list":header_list})
def add_view(self, request):
return render(request, 'add_view.html')
def change_view(self, request, id):
return render(request, 'change_view.html')
def delete_view(self, request, id):
return render(request, 'delete_view.html')
主路由
from django.conf.urls import url
from django.contrib import admin
from Zadmin.Zadmin import site
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Zadmin/', site.urls),
]
HTML文件list_view.html
<h3>查看{{ model_name }}数据</h3>
<div class="container">
<div class="row">
<div class="col-lg-9">
<table class="table table-bordered table-striped">
<thead>
<tr>
//标题显示
{% for item in header_list %}
<th>{{ item }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
//内容显示
{% for new_data in new_data_list %}
<tr>
{% for item in new_data %}
<td>{{ item }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
在app01里面注册表
实现模块化Zadmin
from Zadmin.service.Zadmin import site, ModelZadmin
from app01.models import *
from django.utils.safestring import mark_safe
class BookConfig(ModelZadmin):
def edit(self,obj=None,is_header=False):
# 是标题时返回标题
if is_header:
return "操作"
# 反向解析:url
# 是函数时执行函数
return mark_safe("<a href='%s/change/'>编辑</a>"%obj.pk)
def delete(self,obj=None,is_header=False):
if is_header:
return "操作"
return mark_safe("<a href='%s/delete'>删除</a>"%obj.pk)
def check(self,obj=None,is_header=False):
if is_header:
return "选择"
return mark_safe("<input type='checkbox'>")
list_display=[check,"nid","title","publish",edit,delete]
site.register(Book,BookConfig)
site.register(Publish)