zoukankan      html  css  js  c++  java
  • 自定义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组件

  • 相关阅读:
    爬取豆瓣电影信息
    MongoDB的聚合操作以及与Python的交互
    matplotlib简单示例
    MongoDB基本操作
    K近邻算法
    Scrapy爬取博客园精华区内容
    爬虫失败
    Markdown基本使用方法
    UITableViewCell高度自适应变化
    KVO和NSNotification
  • 原文地址:https://www.cnblogs.com/wlx97e6/p/10110505.html
Copyright © 2011-2022 走看看