自定义admin组件,Xamin

看完前一篇,相信你对Django中admin组件有了一定的了解,下面就一起来设计一个自己的admin组件,Xadmin

Xadmin初始化

首先,在一个django项目中新建两个app,一个用于测试Xadmin(testXadmin),一个书写Xadmin组件(Xadmin),然后将两个app都注册到setting文件中:

然后在template文件夹中设置四个网页页面:

add_view.html

change_view.html

delete_view.html

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>

步骤一 书写注册语句

注册语句为:

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

原文地址:https://www.cnblogs.com/wlx97e6/p/10110505.html