• 模拟admin组件自己开发stark组件之自定义list_display,反向解析url


    反向解析

    在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请转至http://www.cnblogs.com/jokerbj/p/8337486.html反向解析,解决url重复问题

    命名空间

    我们解决了url问题,但是有可能每个应用下也会存在url相同,这个时候django只会标识其中一个,为了解决这个问题,我们加入命名空间概念,转至http://www.cnblogs.com/jokerbj/p/8337486.html

    admin反向解析

    我们针对上一篇文章在url上的修改为下面,在默认的样式类里面,而且是在首页上点击a标签

    #================================= url相关解析
        # 反向解析名称空间的增删改查
        def get_edit_url(self,id):   # 反向解析的url,传id肯定是修改或者删除
            print('====',id)
            c_url = "joker:%s_%s_edit" % (self.model._meta.app_label,self.model._meta.model_name)
            print(c_url)
            edit_url = reverse(c_url,args=(id,))
            return edit_url
            pass
        def get_del_url(self,id):      # 反向解析的url,传id肯定是修改或者删除
            c_url = "joker:%s_%s_delete" % (self.model._meta.app_label, self.model._meta.model_name)
            del_url = reverse(c_url, args=(id,))
            return del_url
    
        def get_list_url(self):      # 反向解析的url,传id肯定是修改或者删除
            c_url = "joker:%s_%s_list" % (self.model._meta.app_label, self.model._meta.model_name)
            list_url = reverse(c_url)
            return list_url
    #=================================显示的样式,和url的反向
        # 我这里给予页面一些默认的按钮,选择按钮,操作按钮
        def edit(self,obj=None,is_header=False):  # 默认编辑按钮
            if is_header:
                return 'op'
            else:
                return mark_safe("<a href='%s'>edit</a>" % self.get_edit_url(obj.id))   # 调用反向解析出来的url
    
        def delete(self,obj=None,is_header=False):  # 默认编辑按钮
            if is_header:
                return 'op'
            else:
                return mark_safe("<a href='%s'>del</a>" % self.get_del_url(obj.id))
    
        def checkbox(self,obj=None,is_header=False):   # 默认多选框
            if is_header:
                return 'select'
            else:
                return mark_safe("<input type='checkbox'>")
        def get_urls(self):                              # 默认的增删改查
    
            # 我这里获取的URL是不是应该加入别名?反向解析呢?
            # url( 正则,视图(元祖,列表),命名空间)
            app_model_name = (self.model._meta.app_label,self.model._meta.model_name)   # 应用名称,表名称
            temp=[
                url("^$",self.list_view,name="%s_%s_list" % app_model_name),
                url("^add/$",self.add_view,name="%s_%s_add" % app_model_name),
                url("^(d+)/change/$",self.change_view,name="%s_%s_edit" % app_model_name),  ###  注意小括号
                url("^(d+)/delete/$",self.delete_view,name="%s_%s_delete" % app_model_name),
            ]
    
            return temp
    
    #============================url
        @property                                    # 获取URL
        def urls(self):
            return self.get_urls(), None, 'joker'   #  URL 第三个参数是命名空间  ### 注意这里我加入了名称空间

    admin自定义显示内容

    我们可以对用户自己控制的显示内容做显示,利用类的继承,重写,有自己的用自己的,没有用父类的

    父类我们给予一些默认的,表头和数据,表头是'op',数据是一个带有反向解析的a标签

    应用app01里面stark.py里面注册内容为

    class bookjoker(joker.ModelAdmin):   # 自定义样式类
        list_display = ('id','title',)
    
    joker.site.register(models.Book,bookjoker)

    在样式类获取页面要显示的dis_play

    class ModelAdmin(object):                            # 默认样式
    
        list_display = ()    # 自定义展示,用户有没有自定义
       def get_list_display(self):              # 得到需要展示的内容
            default_list_display=[]
    
            if self.list_display:
                default_list_display.extend(self.list_display)
                default_list_display.append(ModelAdmin.edit)   # 添加的是对象,不是字符串
                default_list_display.append(ModelAdmin.delete)   # 添加的是对象,不是字符串
                default_list_display.insert(0,ModelAdmin.checkbox)   # 添加的是对象,不是字符串
            else:
                pass    #######   自定义如果是空,那么如何显示???,在下面判断 list_display为空,也就是用户为空
    
            return default_list_display

    样式类有个处理表头,和数据的,在list_vies上

        def list_view(self,request):
            # list_display = (checkbox,"id","title",edit,delete)
    
            # 处理表头,也就是第一行内容,如果数据库有verbose_name字段,就会拿到这个名称
            head_list = []
            for field_name in self.get_list_display():    # id title edit
                if isinstance(field_name,str):
                    ###### 字符串,肯定就是字段了,例如 title字段到这里,就会得到verbose_name名字,如果没有verbose_name那就是本身名称
                    verbox_name = self.model._meta.get_field(field_name).verbose_name
                else:
                    # checkbox edit走这里
                    verbox_name = field_name(self,is_header=True)  ##### 判断是不是头
                head_list.append(verbox_name)
            if not self.list_display:  ####    没有list_display
                head_list = ['选择',self.model._meta.model_name.upper(),]
    
            print('==head_list==',head_list)   # ['ID', '书籍名称', 'op']
    
            # 处理数据
            data_list = self.model.objects.all()   # 得到所有数据库数据
            print('==data_list==',data_list)   # <QuerySet [<Book: linux>, <Book: python>, <Book: go>]>
    
            new_data_list = []     # [[1, 'linux', "<a href='1/chagnge'>edit</a>"], [2, 'python', "<a href='2/chagnge'>edit</a>"], [3, 'go', "<a href='3/chagnge'>edit</a>"]]
    
            for obj in data_list:   # 每一个对象
                temp = []
    
                if not self.list_display:   # 没有dis_play,给予默认头,信息,显示对象
                    temp.append(self.checkbox(obj))
                    temp.append(obj)
                else:
                    for field_name in self.get_list_display():   # (checkbox,"id","title",edit,delete)
                        if isinstance(field_name,str):
                            var = getattr(obj,field_name)   # 拿到对象相对应的字段的值
                        else:
                            var = field_name(self,obj)      # 不是对象里面的字段,执行自己样式方法,但是我要把这个obj传过去,为了修改删除
                        temp.append(var)
    
                new_data_list.append(temp)
    
            print('==new_data_list==',new_data_list)
            return render(request,"joker/change_list.html", locals())
  • 相关阅读:
    Django ORM中常用的字段类型以及参数配置
    python enumerate用法总结
    Django 模板渲染
    Django null=True和blank=True的区别
    Django下关于session的使用
    方程组法求函数的解析式
    求数列通项公式的小众方法
    不等式性质
    多项选择题
    对勾型函数
  • 原文地址:https://www.cnblogs.com/jokerbj/p/8386529.html
Copyright © 2020-2023  润新知