看完前一篇,相信你對Django中admin組件有了必定的瞭解,下面就一塊兒來設計一個本身的admin組件,Xadminhtml
首先,在一個django項目中新建兩個app,一個用於測試Xadmin(testXadmin),一個書寫Xadmin組件(Xadmin),而後將兩個app都註冊到setting文件中:前端
而後在template文件夾中設置四個網頁頁面:python
add_view.htmlgit
change_view.htmldjango
delete_view.htmlapp
list_view.html函數
以一個頁面爲例,作一個簡單的示範:add_view.html測試
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>查看</h3> </body> </html>
註冊語句爲:url
在Xadmin.apps.py中添加以下代碼:設計
from django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class XadminConfig(AppConfig): name = 'Xadmin' def ready(self): # 加載類的時候會自動加載 autodiscover_modules("Xadmin")
在一個利於導入的地方寫下生成site的url生成對象,和渲染基類對象,例如我在Xadmin APP下新建一個server文件夾,server中新建Xadmin.py文件
Xadmin.py:
from django.conf.urls import url from django.shortcuts import HttpResponse, render, redirect class ModelXadmin(object): def __init__(self, model, site): self.model = model self.site = site def list_view(self, request): print("self.model", self.model) data_list = self.model.objects.all() print("data_list", data_list) return render(request, 'list_view.html', {"data_list": data_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): """ url分配,生成對象 """ 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()
這裏生成的site對象就是url中用的site對象
將原來admin對應的路徑處理函數換成本身Xadmin組件中的site.urls
在testXadmin下的models.py文件中書寫表關係對應的類:
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) 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', ) def __str__(self): return self.title
在testXadmin下新建Xadmin.py文件,文件內容以下:
from Xadmin.service.Xadmin import site, ModelXadmin from testXadmin.models import * # Register your models here. class BookConfig(ModelXadmin): list_display = ["title", "prcie"] class PublishConfig(ModelXadmin): list_display = ["name"] site.register(Book, BookConfig) site.register(Publish, PublishConfig) site.register(Author) site.register(AuthorDetail)
這樣就完成了使用Xadmin組件提換了原來的admin組件,並且在測試app中還進行了測試,下面看測試結果
驗證成功,後面編寫前端頁面便可替代原admin組件