python项目篇-Xadmin组件注册设计二

70 篇文章 3 订阅
54 篇文章 0 订阅

1、
Xadmin文件下service包中的Xadmin.py修改


from django.conf.urls import url
from django.shortcuts import HttpResponse ,render ,redirect
class ModelXadmin(object):
    list_display = ["__str__"]
    def __init__(self,model ,site):

        self. model =model
        self. site =site

    def list_view(self, request):
        # print("self.model" ,self.model)
        model_name = self.model._meta.model_name   #取出模型的名字

        data_list=self.model.objects.all()


        header_list=[]#取出表头,因为有字符类型和方法所以加个判断
        for field in self.list_display:
            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  #得到app01中Xadmin增删操作的方法
            else:
                val = field(self,is_header = True)


            header_list.append(val)

        new_data_list = []#得到数据列表
        for obj in data_list:
            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("new_data_list",new_data_list )

        return render(request, 'list_view.html',{ "new_data_list":new_data_list,"model_name":model_name,"header_list":header_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):
    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()

2、app01中的Xadmin.py修改

from django.contrib import admin

# Register your models here.


from Xadmin.service.Xadmin import site,ModelXadmin


from app01.models import *
from django.utils.safestring import  mark_safe

class BookConfig(ModelXadmin):
    def edit(self,obj=None,is_header=False):
        if is_header:
            return "操作"
            
        return mark_safe("<a href='%s/change/'>编辑</a>"%obj.pk)

    def delete(self,obj=None,is_header=False):

        if is_header:
            return "操作"

        return mark_safe("<a href=''>删除</a>")

    def check(self,obj=None,is_header=False):
        if is_header:
            return "选择"

        return mark_safe("<input type='checkbox'>")


    list_display=[check,"nid","title","publish",edit,delete]
    #list_display=["nid","title","publish"]

site.register(Book,BookConfig)



site.register(Publish)
site.register(Author)
site.register(AuthorDetail)

3、修改app01中的model.py文件。注意加verbose_name是为了能在视图中取到中文名字

from django.db import models

# Create your models here.


from django.db import models

# Create your models here.

from django.db import models

# Create your models here.
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,verbose_name="编号")
    title = models.CharField( max_length=32,verbose_name="标题")
    # publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格")

    # 与Publish建立一对多的关系,外键字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE,verbose_name="出版社")
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors=models.ManyToManyField(to='Author',)

    def __str__(self):
        return self.title

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值