Django自定义admin

先新建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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值