码迷,mamicode.com
首页 > 编程语言 > 详细

python—90 自定义的admin后台管理框架

时间:2018-07-23 23:42:10      阅读:410      评论:0      收藏:0      [点我收藏+]

标签:eve   反射   erb   删除按钮   调用   名称   code   append   动态   

知识点归纳:

extend 把两个列表合并;

 

添加id,编辑, 删除 按钮到页面上

1、把list_display里面的字段合并到新的列表中,再把编辑,删除按钮和页面内容展示出来,

把这些封装成函数,然后传参过来is_header=False,如果是True就返回头标名字;

# 需要把delete_col和list_display放进一个新的配置类列表中
    def get_new_list_display(self):
        new_list_display = []
        new_list_display.extend(self.list_display)
        new_list_display.append(ModelStark.edit_col)
        new_list_display.append(ModelStark.delete_col)
        # 把插入的放到列表的第一位去
        new_list_display.insert(0, ModelStark.check_col)
        return new_list_display
技术分享图片
    def delete_col(self, obj=None, is_header=False):
        app_label = self.model._meta.app_label
        model_name = self.model._meta.model_name

        if is_header:
            return 删除
        # 返回  href=‘%s/delete/‘这样写就是在原来的url基础上增加 ID值/delete/
        # 但是利用django的反向解析就可以通过动态改变url,使url写好的url可以改变

        _url = reverse(delete, args=(obj.pk,))
        # /id/delete/
        # /1/delete/
        # / 1 / deletew /
        print(_url)
        return mark_safe("<a href=‘%s‘>删除</a>" % _url)

    def edit_col(self, obj=None, is_header=False):
        app_label = self.model._meta.app_label
        model_name = self.model._meta.model_name
        if is_header:
            return 编辑

        # url(‘^(\d+)/delete/$‘, self.delete_view, name=‘delete‘)

        _url = reverse(%s_%s_change % (app_label, model_name), args=(obj.pk,))

        return mark_safe("<a href=‘%s‘>编辑</a>" % _url)

    def check_col(self, obj=None, is_header=False):
        if is_header:
            return 选择
        return mark_safe("<input type=‘checkbox‘>")
View Code

 

2、插入头部和表单数据到table里面

   做了一件事情就是遍历, 字段和方法

 

技术分享图片
head_list = []
        for field_or_func in self.get_new_list_display():
            # 判断field_or_func是否是字符串,如果是就代表传过来的是字段名
            if isinstance(field_or_func, str):
                # 如果是字段名如果等于 ‘__str__‘ 就表示拿到的是默认的字段规则
                if field_or_func == __str__:
                    # 获取当前model对象的字段值
                    val = self.model._meta.model_name.upper()
                # 拿到的是自定义的注册规则的字段
                else:
                    # 获取自定义字段的值
                    # _meta.get_field(字段字符串)
                    field_obj = self.model._meta.get_field(field_or_func)
                    val = field_obj.verbose_name
            else:
                # 拿到自定义的头部字段名称
                val = field_or_func(self, is_header=True)
            head_list.append(val)

        # 表单数据
        data_list = []
        for obj in queryset:
            temp = []
            # 循环new_list_display里面所有的字段名与函数
            for field_or_func in self.get_new_list_display():
                # 判断field_or_func是不是字符串,是就代表是字段名
                if isinstance(field_or_func, str):
                    # 把field当成字符串属性了  所以需要通过反射 getattr(obj, field)
                    val = getattr(obj, field_or_func)
                else:
                    # 如果是函数就直接调用,当作函数来用把self 和 obj传进去
                    val = field_or_func(self, obj)
                # 把所有的field
                temp.append(val)
                # obj.authors 多对多字段就需要通过判断来处理
                # Django的admin一旦碰到多对多的表就会直接报错 意思就是让我们去自定义
            data_list.append(temp)
        print(data_list)
        return render(request, "stark/list_view.html", {"data_list": data_list, head_list: head_list})
View Code

 

 

3、用reverse反转动态匹配跳转url

 

    def get_urls(self):
        app_label = self.model._meta.app_label
        model_name = self.model._meta.model_name

        temp = [
            url(^$, self.list_view, name=%s_%s_list % (app_label, model_name)),
            url(^add/$, self.add_view, name=%s_%s_add % (app_label, model_name)),
            # 需要把id传过来要不然不可以通过id获取到需要修改的
            url(^(\d+)/change/$, self.change_view, name=%s_%s_change % (app_label, model_name)),
            # /1/deletew/
            url(^(\d+)/delete/$, self.delete_view, name=delete)
        ]
        return temp

 

 

 

 

  

python—90 自定义的admin后台管理框架

标签:eve   反射   erb   删除按钮   调用   名称   code   append   动态   

原文地址:https://www.cnblogs.com/kermitjam/p/9357292.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!