• 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'>"]]
    

      

  • 相关阅读:
    tty & pty & pts
    PageRank
    How to run a terminal inside of vim?
    vimdiff
    svn's tree conflict
    svn's diff command
    符号表分离
    gcc -D
    Options for Debugging Your Program or GCC
    invoking gdb
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/9137842.html
Copyright © 2020-2023  润新知