自定義admin組件,Xamin

看完前一篇,相信你對Django中admin組件有了必定的瞭解,下面就一塊兒來設計一個本身的admin組件,Xadminhtml

Xadmin初始化

首先,在一個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單例對象,渲染基類對象

在一個利於導入的地方寫下生成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對象

改寫url.py文件

將原來admin對應的路徑處理函數換成本身Xadmin組件中的site.urls

在測試app中進行測試:

在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組件

相關文章
相關標籤/搜索