您现在的位置是: 网站首页 >Django >DjangoCRM客户关系管理 Django
【CRM客户关系管理】10.处理无list_display和list_filter属性时的异常情况
admin2018年11月27日 18:30 【Django | Html | Python 】 1216人已围观
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
当前用户
未登录,点击 登录专题目录
- 【CRM客户关系管理】01.项目介绍分析
- 【CRM客户关系管理】02.设置项目需要的模型
- 【CRM客户关系管理】03.使用Bootstrap前端模板
- 【CRM客户关系管理】04.用户登录登录及访问控制
- 【CRM客户关系管理】05.动态菜单生成,绝对URL和动态URL
- 【CRM客户关系管理】06.创建djadmin APP,并进行相关配置
- 【CRM客户关系管理】07.自动发现APP注册并显示列表
- 【CRM客户关系管理】08.取出app中model的值,根据list_display配置生成数据列表
- 【CRM客户关系管理】09.根据模型中字段的choices以及时间区间来过滤数据
- 【CRM客户关系管理】10.处理无list_display和list_filter属性时的异常情况
- 【CRM客户关系管理】11.为查询结果添加分页和排序功能
- 【CRM客户关系管理】12.查询结果分页、排序、过滤组合
- 【CRM客户关系管理】13.为结果添加搜索功能,搜索后能对其进行过滤
- 【CRM客户关系管理】14.生成动态ModelForm表单功能
- 【CRM客户关系管理】15.动态ModelsForm增加自定义样式,修改初始化表单并提交
- 【CRM客户关系管理】16. 只读字段readonly_fields处理,表单排除只读显示
- 【CRM客户关系管理】17.多选字段filter_horizontal的实现,已选和未选数据展示
- 【CRM客户关系管理】18.多选字段filter_horizontal的实现,js移动多选框数据和过滤
- 【CRM客户关系管理】19.对象删除功能,显示删除的关联对象和确认
- 【CRM客户关系管理】20.增加详情页分页功能
- 【CRM客户关系管理】21.action功能开发,默认action,生成自己的action
- 【CRM客户关系管理】22.action功能开发,执行action功能,添加默认的delete action