开发stark组件2

上个博客咱们,咱们写到了要告诉前端页面应该展现什么字段 ,今天咱们就来详细说一下 如何后端取到咱们须要的字段 并在前端页面展现出来css

首先咱们先把前端页面写死,先看一下效果html

后端查看页面代码:前端

    def list_view(self,request):


        #用户访问的模型表:  self.model
        print("self.model:",self.model)


        print("self.list_display",self.list_display,'-'*30)


        queryset=self.model.objects.all()
        list_name=[
            '书名',
            '价格'
        ]

        data_list=[
            ['金梅',122],
            ['火影忍者',23],
            ['乡间小道',8],
        ]

        return render(request,"stark/list_view.html",{'data_list':data_list,'list_name':list_name})

前端页面:jquery

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>

<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <table class="table table-bordered ">
                <thead>
                <tr>
                    {% for foo in list_name %}
                        <th>{{ foo }}</th>
                    {% endfor %}
                </tr>
                </thead>
                <tbody>
                {% for foo in data_list %}
                    <tr>
                        {% for bar in foo %}
                            <td>{{ bar }}</td>
                        {% endfor %}
                    </tr>
                {% endfor %}
                </tbody>
            </table>

        </div>
    </div>
</div>

<script src="/static/jquery-3.3.1.min.js"></script>

</body>
</html>

显示的效果数据库

这就咱们今天要完成的 根据自定义配置的不一样 显示不一样的字段bootstrap

既然咱们要根据自定义的字段 显示相应的字段 咱们就须要在后端 取到相应的字段 后端

下面咱们就改为从数据库里取值安全

    def list_view(self,request):



        queryset=self.model.objects.all()

        data_list=[]
        for obj in queryset:
            temp=[]

            for ziduan in self.list_display:
                val=getattr(obj,ziduan)
                temp.append(val)
            data_list.append(temp)
            print(temp)
        print(data_list,'........')

        return render(request,"stark/list_view.html",{'data_list':data_list})

上面只是拿到了表格的内容 表格的列名尚未取到app

 def list_view(self,request):


        queryset=self.model.objects.all()
        header_list=[]
        for name in self.list_display:
            obj = self.model._meta.get_field(name)#根据字段找到相应的对象
            val = obj.verbose_name#拿到字段的中文名
            header_list.append(val)
        data_list=[]
        for obj in queryset:
            temp=[]

            for ziduan in self.list_display:
                val=getattr(obj,ziduan)
                temp.append(val)
            data_list.append(temp)
            print(temp)
        print(data_list,'........')

        return render(request,"stark/list_view.html",{'data_list':data_list,'header_list':header_list})

这样咱们就完成了 从数据库里取值 可是还有一个问题 咱们取到的list_display是配置类默认的 而非咱们自定义的 就会报错 因此咱们须要加个判断函数

      header_list=[]
        for name in self.list_display:
            if name=='__str__':
                val = self.model._meta.model_name.upper()
                print(val,'1')
            else:
                obj = self.model._meta.get_field(name)#根据字段找到相应的对象
                val = obj.verbose_name#拿到字段的中文名
            header_list.append(val)

上面已经完成了最初的目标 可是咱们也能够在此基础上添加自定义列 以下图

app01下的stark 自定义一个删除列

    def delete_col(self, obj=None, is_header=False):
        if is_header:
            return "删除"
        return mark_safe("<a href='%s/delete/'>删除</a>" % obj.pk) #mark_safe至关于标签是安全的 不要转译

    list_display = ["title","price",delete_col]

site.register(models.Book,BookConfig)

这样咱们list_display就会有一个非字符串的值 

那在咱们的配置类就须要判断一个是否,不然程序就会崩掉了

class ModelStark():
    def __init__(self,model):
        self.model = model

    list_display = ["__str__"]

    def list_view(self,request):



        #用户访问的模型表:  self.model
        print("self.model:",self.model)


        # print("self.list_display",self.list_display,'-'*30)

        queryset=self.model.objects.all()
        header_list=[]
        for name in self.list_display:
            if isinstance(name,str):

                if name=='__str__':
                    val = self.model._meta.model_name.upper()
                    print(val,'1')
                else:
                    obj = self.model._meta.get_field(name)#根据字段找到相应的对象
                    val = obj.verbose_name#拿到字段的中文名
            else:
                val=name(self,is_header=True)
            header_list.append(val)
        data_list=[]
        for obj in queryset:
            temp=[]

            for ziduan in self.list_display:
                if isinstance(ziduan,str):#判断是否是字符串
                    val=getattr(obj,ziduan)
                else:
                    val=ziduan(self,obj)
                temp.append(val)
            data_list.append(temp)
            print(temp)
        print(data_list,'........')

        return render(request,"stark/list_view.html",{'data_list':data_list,'header_list':header_list})

可是这样还不够好 咱们应该把删除这种操做设计成默认的 咱们知道设置成默认的就是在配置类里添加,可是有一个问题 若是将这些加入list_display里,那若是有自定义的 那么配置类就会被覆盖 因此咱们要想一个办法解决这个问题

先将删除 编辑 选择 定义到配置类

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

        if is_header:
            return "删除"

        return mark_safe("<a href='%s/delete/'>删除</a>"%obj.pk)

    def edit_col(self,obj=None,is_header=False):
        if is_header:
            return "编辑"

        return mark_safe("<a href=''>编辑</a>")

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

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

既然咱们把上面的函数放进list_display里 也会被自定义的类覆盖 那咱们能够在建立新列表 把上面的和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

相关文章
相关标签/搜索