1

day 84 Xadmin组件之构建表单数据

 

一 、先设置一些相关配置

 

1. 创建数据库模型。 在app01 下创建 

 

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)

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()


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',)
View Code

然后在迁移 . 命令为 python manage.py makemigrations   /  python manage.py migrate 

 

2 . 创建数据库模型在,app02 下面

 

 3. 然后在settings里进行配置.

 

4. 设置静态文件路径

 

 

 5. 设置数据库

 

6. URL路由

1 urlpatterns = [
2     url(r'^admin/',  admin.site.urls),
3     url(r'^Xadmin/', site.urls),
4     url(r'^index/', foo),
5 ]
View Code

 

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():
            # 获取当前循环的model的字符串与所在app的字符串
            app_name = model._meta.app_label     #  "app01"
            model_name = model._meta.model_name  # "book"

            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()
XadminSite 类

 

 

 

 

self._registry 打印的东西

打印结果:

 

{<class 'app01.models.Book'>: <app01.Xadmin.BookConfig object at 0x0000016253049BA8>,
 <class 'app01.models.Publish'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253049BE0>,
 <class 'app01.models.Author'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253049CC0>, 
<class 'app01.models.AuthorDetail'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x00000162530520F0>, 
<class 'app02.models.Order'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253052358>, 
<class 'app02.models.Food'>: <app02.Xadmin.FoodConfig object at 0x0000016253052390>}

 

    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
View Code

 

 

 

 

处理表头数据 放在了 ModelXadmin python文件夹下 :

处理表头数据
    def list_view(self, request):
        print("self.model", self.model) # 用户访问哪张表,self.model就是谁。
        model_name=self.model._meta.model_name
        data_list = self.model.objects.all()
        print("list_display:",self.list_display) ## ['title', 'prcie']

        # 处理表头
        #header_list=["ID","书籍名称","出版社"]
        header_list=[]

        for field in self.list_display: # [check,"nid","title","publish",edit,delete]
            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

            else:
                val=field(self,is_header=True)  #  获取表头,传is_header=True

处理表单数据

# 处理表单数据
        new_data_list=[]
        for obj in data_list:  #   data_list [book_obj,book_obj2,...]

            temp=[]
            for field in self.list_display: # ['title', 'prcie',edit,delete]
                if isinstance(field,str):
                    val=getattr(obj,field)
                else:
                    val=field(self,obj)

                temp.append(val)

            new_data_list.append(temp)
处理表单数据

 

 

在Xadmin文件下的app 文件中添加如下代码

1 from django.apps import AppConfig
2 from django.utils.module_loading import autodiscover_modules
3 
4 class XadminConfig(AppConfig):
5     name = 'Xadmin'
6     def ready(self):
7         autodiscover_modules('Xadmin')
View Code

 

处理表头数据

class ModelXadmin(object):
    list_display=["__str__",]

    def __init__(self,model,site):
        self.model =model
        self.site =site

    def list_view(self,request):
        print("self.model9999999999999",self.model) #用户访问哪张表,self.model就是谁。

    self.model9999999999999 <class 'app01.models.Book'>

         model_name =self.model._meta.model_name

        data_list = self.model.objects.all()
        print("list_display",self.list_display)##['title','price]

    list_display [<function BookConfig.check at 0x000001A2AF7C5730>, 'nid', 'title', 'publish', 'price', <function BookConfig.edit at 0x000001A2AF7BBAE8>, <function BookConfig.delete at 0x000001A2AF7C57B8>]

        #处理表头
        header_list=[]
        #[check,'nid','title','publish','price',edit,delete]
        for  field in self.list_display:# model类的字段
            if isinstance(field,str):
                if field =='__str__':
                    print(field)
                    val =self.model._meta.model_name.upper()
                    print('val',val)
                else:
                    field_obj =self.model._meta.get_field(field)
                    print('11111111111',field_obj)
                    val =field_obj.verbose_name
                    print(val)

11111111111 app01.Book.nid
nid
11111111111 app01.Book.title
title
11111111111 app01.Book.publish
publish
11111111111 app01.Book.price
price


else: val = field(self,is_header=True) #获取表头,传is_header=True header_list.append(val)

输出结果:

self.model9999999999999 <class 'app01.models.Book'>
list_display [<function BookConfig.check at 0x000001A2AF7C5730>, 'nid', 'title', 'publish', 'price', <function BookConfig.edit at 0x000001A2AF7BBAE8>, <function BookConfig.delete at 0x000001A2AF7C57B8>]
11111111111 app01.Book.nid
nid
11111111111 app01.Book.title
title
11111111111 app01.Book.publish
publish
11111111111 app01.Book.price
price
Book object

 

表单数据body 的处理 

 

   #处理表单数据
        new_data_list=[]
        for obj in data_list:# data_list [book_obj,book_obj2...]
            print(obj)
            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('8888',new_data_list)
        return render(request, 'list_view.html', {"new_data_list": new_data_list,"model_name":model_name,"header_list":header_list})

结果:

 

8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]
Book object
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]
Book object
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 3, 'python', <Publish: 五道口出版社>, Decimal('333.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]
Book object
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 3, 'python', <Publish: 五道口出版社>, Decimal('333.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 4, 'c', <Publish: 清华出版社>, Decimal('444.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]

  

 

posted @ 2018-06-05 08:06  萌哥-爱学习  阅读(273)  评论(0)    收藏  举报