zoukankan      html  css  js  c++  java
  • python+Django CRM客户关系管理系统开发(二)--数据表展示页面开发

    一、表展示页开发

    上一篇我们实现了admin首页的功能,且表有跳转链接,接下来开发表展示页面。

    1、表展示页开发

    上一节,表展示页是通过这个url跳转过去的:

    re_path('(w+)/(w+)/$',views.table_obj_list,name='table_objs'),

    对应的视图函数table_obj_list设置的为空,这节我们给补充上内容。

    2、首先要明白的是,对于写了自定义展示admin_class的,表的展示页展示的是我们在baseadmin里自定义的展示项。没有写的,按照默认展示。

    先开发如何展示自定义展示的表。

     自定义展示是由list_display这一项控制的

    (1)、仿照admin创建一个HTML页面table_obj_list.html,用table来展示数据表。

    (2)、获取数据,通过views函数返回数据,供前端使用

    def table_obj_list(request,app_name,model_name):
    admin_class = enabled_admins[app_name][model_name]
    return render(request,'table_obj_list.html',{"admin_class":admin_class})

    展示效果如图:

    (3)、接下来获取表中数据,并返回给前端

     获取表中的数据,肯定得用 models.objects.all()来获取,那么如何获取model就是个问题,因此这里需要改一下注册函数,添加admin_class.module = model_class,将admin_class与model_class关联起来:

    def register(model_class,admin_class=BaseAdmin):
    app_name = model_class._meta.app_label
    model_name = model_class._meta.model_name
    admin_class.model = model_class
    if app_name not in enabled_admins:
    enabled_admins[app_name] = {}
    enabled_admins[app_name][model_name] = admin_class

    这样在views函数中,就可以querysets = admin_class.model.objects.all()获取到表中的数据了,返回给前端即可:

    def table_obj_list(request,app_name,model_name):
    admin_class = enabled_admins[app_name][model_name]
    querysets = admin_class.model.objects.all()
    return render(request,'table_obj_list.html',{"admin_class":admin_class,"querysets":querysets})

    前端调用此返回值,即可在页面上显示:

    (4)、但是发现一个问题,没有自定义展示项的model,显示的内容全部都一样,经过分析,是因为没有自定义的mdoel都共享同一个baseadmin内存对象(三个model内存地址一样),我们只需要实例化就可以了(实例化后就都有单独的内存空间了)

    因此需要修改注册函数:

     

    修改注册函数,

    def register(model_class,admin_class=BaseAdmin):
    app_name = model_class._meta.app_label
    model_name = model_class._meta.model_name
    if not admin_class:
    #如果没写admin_class,就实例化一个BaseAdmin对象
    admin_class = BaseAdmin()
    else:
    #如果有自定义展示的admin_class,就实例化自己
    admin_class = admin_class()
    admin_class.model = model_class
    if app_name not in enabled_admins:
    enabled_admins[app_name] = {}
    enabled_admins[app_name][model_name] = admin_class

    然后查看,显示正常:

     3、美化一下显示效果:

    需要解决的问题就是:每一列的字段对应的值如何展示在对应的字段下方。这里需要用到反射:getattr(obj,字段)。

    每个表字段不一样,字段对应的值也不一样,因此,要想展示表中每一行的数据,还需要动态生成。

    比如customerinfo表,每一个用户信息都有id,name,source,consult_courses,consultant,status信息,因此需要动态生成这几个信息,并且显示在一行


    <tbody>

      <tr>
    <td>1</td>
    <td>张三</td>
    <td>转介绍</td>
      </tr>
    <tr>
    <td>2</td>
    <td>李四</td>
    <td>百度推广</td>
      </tr>

    </tbody>

    因此,不能单纯的再循环展示了,需要用到tag

    在baseadmin应用中创建一个templatetags文件夹,在文件夹内创建一个tags.py文件。

    先创建一个动态生成表中数据的方法:

    因为querysets里的每一个对象,都需要生成一个上边的tr+td的组合,因此,设计步骤就是:循环querysets,生成对应的td

    首先,我想到的办法是,在后台生成这几个元素,然后返回给前端使用:如下图,生成的所有页面元素放在一个列表里,然后返回给前端:

     返回给前端使用:

     但是页面上显示效果是这样的:

     原来是csrf的安全原因,对后台tag作如下修改即可:

    引入from django.utils.safestring import mark_safe 

    此时页面显示结果如图所示:

    显示正常了,但是多了个列表的["","",""],想了很久不知道怎么解决,先记录一下,这里在改其他办法解决

    方法就是在页面上直接循环生成td,不再保存在一起,最后统一返回了。修改tag如下所示:

     前端页面修改如下:

     最后页面显示如下,没有多余的[]之类的:

    但是发现,显示的consult_course显示不对,在Django的admin上试了一下,提示字段不能为manytomany,这里也先不做manytomany,回头再做。把这个字段改为consult_content

    4、下拉选择框优化

    一些下拉框显示的是选项的序号,这里想让它显示为对应的选项,下面修改一下。

     显示效果如图:

     

  • 相关阅读:
    Kaggle案例分析1--Bestbuy
    [翻译]用神经网络做回归(Using Neural Networks With Regression)
    【MySql】delete用法
    【MySql】like用法
    【MySql】Order By 排序
    【MySql】Group By数据分组
    【shell】一篇文章学懂Shell脚本
    【MySql】删除操作
    python 面向对象编程(高级篇)
    python 面向对象编程(初级篇)
  • 原文地址:https://www.cnblogs.com/realizetomoney/p/13862438.html
Copyright © 2011-2022 走看看