1、
Xadmin文件下service包中的Xadmin.py修改
from django.conf.urls import url
from django.shortcuts import HttpResponse ,render ,redirect
class ModelXadmin(object):
list_display = ["__str__"]
def __init__(self,model ,site):
self. model =model
self. site =site
def list_view(self, request):
# print("self.model" ,self.model)
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 = self.model._meta.model_name.upper()
else:
field_obj = self.model._meta.get_field(field)
val = field_obj.verbose_name #得到app01中Xadmin增删操作的方法
else:
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:
if isinstance(field,str):
val = getattr(obj,field)
else:
val = field(self,obj)
temp.append(val)
new_data_list.append(temp)
print("new_data_list",new_data_list )
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')
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
@property
def urls2(self):
return self.get_urls2(), None, None
class XadminSite(object):
def __init__(self, name='admin'):
self._registry = {}
def get_urls(self):
print(self._registry) # {Book:modelAdmin(Book),.......}
temp = []
for model, admin_class_obj in self._registry.items():
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), )
'''
url(r"app01/book",ModelXadmin(Book,site).urls2)
url(r"app01/publish",ModelXadmin(Publish,site).urls2)
url(r"app02/order",ModelXadmin(Order,site).urls2)
'''
return temp
@property
def urls(self):
return self.get_urls(), None, None
def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelXadmin
self._registry[model] = admin_class(model, self) # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)}
site= XadminSite()
2、app01中的Xadmin.py修改
from django.contrib import admin
# Register your models here.
from Xadmin.service.Xadmin import site,ModelXadmin
from app01.models import *
from django.utils.safestring import mark_safe
class BookConfig(ModelXadmin):
def edit(self,obj=None,is_header=False):
if is_header:
return "操作"
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=''>删除</a>")
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]
#list_display=["nid","title","publish"]
site.register(Book,BookConfig)
site.register(Publish)
site.register(Author)
site.register(AuthorDetail)
3、修改app01中的model.py文件。注意加verbose_name是为了能在视图中取到中文名字
from django.db import models
# Create your models here.
from django.db import models
# Create your models here.
from django.db import models
# Create your models here.
from django.db import models
# Create your models here.
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
age=models.IntegerField()
# 与AuthorDetail建立一对一的关系
authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
def __str__(self):
return self.name
class AuthorDetail(models.Model):
nid = models.AutoField(primary_key=True)
birthday=models.DateField()
telephone=models.BigIntegerField()
addr=models.CharField( max_length=64)
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=32)
city=models.CharField( max_length=32)
email=models.EmailField()
def __str__(self):
return self.name
class Book(models.Model):
nid = models.AutoField(primary_key=True,verbose_name="编号")
title = models.CharField( max_length=32,verbose_name="标题")
# publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格")
# 与Publish建立一对多的关系,外键字段建立在多的一方
publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE,verbose_name="出版社")
# 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
authors=models.ManyToManyField(to='Author',)
def __str__(self):
return self.title