一 、先设置一些相关配置
1. 创建数据库模型。 在app01 下创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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) 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() class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField( max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2) # 与Publish建立一对多的关系,外键字段建立在多的一方 publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表 authors=models.ManyToManyField(to='Author',)
然后在迁移 . 命令为 python manage.py makemigrations / python manage.py migrate
2 . 创建数据库模型在,app02 下面
3. 然后在settings里进行配置.
4. 设置静态文件路径
5. 设置数据库
6. URL路由
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 urlpatterns = [ 2 url(r'^admin/', admin.site.urls), 3 url(r'^Xadmin/', site.urls), 4 url(r'^index/', foo), 5 ]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(): # 获取当前循环的model的字符串与所在app的字符串 app_name = model._meta.app_label # "app01" model_name = model._meta.model_name # "book" 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()
self._registry 打印的东西
打印结果:
{<class 'app01.models.Book'>: <app01.Xadmin.BookConfig object at 0x0000016253049BA8>, <class 'app01.models.Publish'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253049BE0>, <class 'app01.models.Author'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253049CC0>, <class 'app01.models.AuthorDetail'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x00000162530520F0>, <class 'app02.models.Order'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253052358>, <class 'app02.models.Food'>: <app02.Xadmin.FoodConfig object at 0x0000016253052390>}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
处理表头数据 放在了 ModelXadmin python文件夹下 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def list_view(self, request): print("self.model", self.model) # 用户访问哪张表,self.model就是谁。 model_name=self.model._meta.model_name data_list = self.model.objects.all() print("list_display:",self.list_display) ## ['title', 'prcie'] # 处理表头 #header_list=["ID","书籍名称","出版社"] header_list=[] for field in self.list_display: # [check,"nid","title","publish",edit,delete] 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 else: val=field(self,is_header=True) # 获取表头,传is_header=True
处理表单数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 处理表单数据 new_data_list=[] for obj in data_list: # data_list [book_obj,book_obj2,...] temp=[] for field in self.list_display: # ['title', 'prcie',edit,delete] if isinstance(field,str): val=getattr(obj,field) else: val=field(self,obj) temp.append(val) new_data_list.append(temp)
在Xadmin文件下的app 文件中添加如下代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from django.apps import AppConfig 2 from django.utils.module_loading import autodiscover_modules 3 4 class XadminConfig(AppConfig): 5 name = 'Xadmin' 6 def ready(self): 7 autodiscover_modules('Xadmin')
处理表头数据
class ModelXadmin(object): list_display=["__str__",] def __init__(self,model,site): self.model =model self.site =site def list_view(self,request): print("self.model9999999999999",self.model) #用户访问哪张表,self.model就是谁。
self.model9999999999999 <class 'app01.models.Book'>
model_name =self.model._meta.model_name
data_list = self.model.objects.all() print("list_display",self.list_display)##['title','price]
list_display [<function BookConfig.check at 0x000001A2AF7C5730>, 'nid', 'title', 'publish', 'price', <function BookConfig.edit at 0x000001A2AF7BBAE8>, <function BookConfig.delete at 0x000001A2AF7C57B8>]
#处理表头 header_list=[] #[check,'nid','title','publish','price',edit,delete] for field in self.list_display:# model类的字段 if isinstance(field,str): if field =='__str__': print(field)
val =self.model._meta.model_name.upper() print('val',val) else: field_obj =self.model._meta.get_field(field) print('11111111111',field_obj) val =field_obj.verbose_name print(val)
11111111111 app01.Book.nid
nid
11111111111 app01.Book.title
title
11111111111 app01.Book.publish
publish
11111111111 app01.Book.price
price
else: val = field(self,is_header=True) #获取表头,传is_header=True header_list.append(val)
输出结果:
self.model9999999999999 <class 'app01.models.Book'> list_display [<function BookConfig.check at 0x000001A2AF7C5730>, 'nid', 'title', 'publish', 'price', <function BookConfig.edit at 0x000001A2AF7BBAE8>, <function BookConfig.delete at 0x000001A2AF7C57B8>] 11111111111 app01.Book.nid nid 11111111111 app01.Book.title title 11111111111 app01.Book.publish publish 11111111111 app01.Book.price price Book object
表单数据body 的处理
#处理表单数据 new_data_list=[] for obj in data_list:# data_list [book_obj,book_obj2...] print(obj) 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('8888',new_data_list) return render(request, 'list_view.html', {"new_data_list": new_data_list,"model_name":model_name,"header_list":header_list})
结果:
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]] Book object 8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]] Book object 8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 3, 'python', <Publish: 五道口出版社>, Decimal('333.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]] Book object 8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 3, 'python', <Publish: 五道口出版社>, Decimal('333.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 4, 'c', <Publish: 清华出版社>, Decimal('444.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]