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、下拉选择框优化

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

 显示效果如图:

 

原文地址:https://www.cnblogs.com/realizetomoney/p/13862438.html