您现在的位置是: 网站首页 >Django >DjangoCRM客户关系管理 Django

【CRM客户关系管理】10.处理无list_display和list_filter属性时的异常情况

admin2018年11月27日 18:30 Django | Html | Python 1024人已围观

DjangoCRM客户关系管理简介 使用Django2.1.3+Bootstrap实现CRM系统,仿照Django Admin重写后台 Github地址:https://github.com/xyliurui/DjangoCRM Django版本:2.1.3

### 修改无自定义注册模型报错问题 现在访问没有自定义注册的model会报错,因为基类中没有写`list_display`和`list_filter`。 访问 http://127.0.0.1:8000/djadmin/crm/userprofile/ ![BLOG_20181127_183517_55](/media/blog/images/2018/11/BLOG_20181127_183517_55.png "博客图集BLOG_20181127_183517_55.png") 在基类中设置一个空列表就可以了 #### 修改djadmin注册基类 修改djadmin应用下的djadmin_base.py文件,增加一个父类,且为空列表的属性 ```python # djadmin/djadmin_base.py class BaseDjAdmin(object): list_display = [] list_filter = [] search_fields = [] ``` 现在访问 http://127.0.0.1:8000/djadmin/crm/userprofile/ 没有报错,但是没有显示出数据,需要在 `build_table_head_name` 和 `build_table_body` 里面添加个判断 ![BLOG_20181127_183544_56](/media/blog/images/2018/11/BLOG_20181127_183544_56.png "博客图集BLOG_20181127_183544_56.png") ### 修改无list_display显示内容 由于注册类继承了`BaseDjAdmin(object)`,默认`list_display = []`,如没有自定义注册模型的`list_display`,则进行判断,这时候表的标题就是model的别名;表的内容就显示model的返回值 #### 修改模板标签的list_display判断 修改djadmin应用下的templatetags包中的djadmin_tags.py 使用`admin_class.model._meta.verbose_namea`获取模型的别名,`dmin_class.model._meta.model_name`可以获得模型的类名。 ```python # 显示模型表的中文名称 @register.simple_tag def build_table_head_name(admin_class): th = '' if admin_class.list_display: for display_field in admin_class.list_display: # 获取列中的字段对象 display_field_obj = admin_class.model._meta.get_field(display_field) # print(display_field_obj.verbose_name) tmp = "<th>{}</th>".format(display_field_obj.verbose_name) th += tmp else: th += "<th>{}</th>".format(admin_class.model._meta.verbose_name) # 如果没有自定义注册,则表格标题就显示模型的别名verbose_name return mark_safe(th) # 显示表数据 @register.simple_tag def build_table_body(obj, admin_class): """ 生成一条记录的html元素 :param obj: 一个模型查询集中的一个对象 :param admin_class: 自定义注册的类 :return: 得到这个对象要求显示的所有列 """ td = '' if admin_class.list_display: for display_field in admin_class.list_display: # 获取列中的字段对象 display_field_obj = admin_class.model._meta.get_field(display_field) # print(display_field_obj) # 字段对象choices方法,如果有choices,则使用get_xxx_display if display_field_obj.choices: # print('get_{}_display'.format(display_field)) display_field_data = getattr(obj, 'get_{}_display'.format(display_field))() # 使用get_xxx_display()需要带括号,调用函数执行结果,而不带括号得到的是函数对象 else: # 根据属性名,获取对象的属性值,两个参数,一个对象obj,一个列名 display_field_data = getattr(obj, display_field) # 获取一个对象的属性值,例如<CustomerInfo: 小东>对象,得到他的name属性,值为小东 tmp = "<td>{}</td>".format(display_field_data) td += tmp else: td += "<td>{}</td>".format(obj) # 如果没有自定义注册字段,则显示对象的内容verbose_name return mark_safe(td) ``` 访问 http://127.0.0.1:8000/djadmin/crm/userprofile/ 如果model没有`verbose_name`,则显示model的名字为表名,否则显示`verbose_name` ![BLOG_20181127_183558_49](/media/blog/images/2018/11/BLOG_20181127_183558_49.png "博客图集BLOG_20181127_183558_49.png") ![BLOG_20181127_183616_18](/media/blog/images/2018/11/BLOG_20181127_183616_18.png "博客图集BLOG_20181127_183616_18.png") ### 修改无list_filter隐藏过滤 当没有自定义注册模型中的`list_filter`字段,默认为空,则前端页面不再显示过滤按钮 #### 修改模板无list_filter隐藏过滤 修改table_detail.html当没有`list_filter`字段时,不显示 ```html {% if admin_class.list_filter %} <p> <form class="navbar-form navbar-left"> {% for filter_field in admin_class.list_filter %} {% build_option_filter filter_field admin_class %} {% endfor %} <button type="submit" class="btn btn-primary">过滤</button> </form> </p> {% endif %} ``` ![BLOG_20181127_183627_74](/media/blog/images/2018/11/BLOG_20181127_183627_74.png "博客图集BLOG_20181127_183627_74.png") ![BLOG_20181127_183648_42](/media/blog/images/2018/11/BLOG_20181127_183648_42.png "博客图集BLOG_20181127_183648_42.png")

很赞哦! (0)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行2078天
  • 系统信息:Linux
  • 后台程序:Python: 3.8.10
  • 网站框架:Django: 3.2.6
  • 文章统计:256 篇
  • 文章评论:60 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 公众号:微信扫描二维码,关注我们
  • QQ群:QQ加群,下载网站的学习源码
返回
顶部
标题 换行 登录
网站