您现在的位置是: 网站首页 >Django >DjangoCRM客户关系管理 Django
【CRM客户关系管理】14.生成动态ModelForm表单功能
admin2018年12月4日 11:28 【Django | Html | Python 】 1239人已围观
DjangoCRM客户关系管理简介 使用Django2.1.3+Bootstrap实现CRM系统,仿照Django Admin重写后台 Github地址:https://github.com/xyliurui/DjangoCRM Django版本:2.1.3
## *动态ModelForm功能实现 ### 修改数据功能 #### 数据第一列增加a标签 修改模板标签`build_table_body(obj, admin_class)`,在根据`list_display`列表生成数据表时,如果是第一列,则为其增加一个a标签,可以进行数据修改的 ```python # 显示表数据 @register.simple_tag def build_table_body(obj, admin_class): """ 生成一条记录的html元素 :param obj: 一个模型查询集中的一个对象 :param admin_class: 自定义注册的类 :return: 得到这个对象要求显示的所有列 """ td = '' if admin_class.list_display: for index, display_field in enumerate(admin_class.list_display): # 增加enumerate函数实现自动增加索引号 # 获取列中的字段对象 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) if index == 0: # 当列的索引号为0,也就是第一列时,增加a标签 tmp = "<td><a href='{}/change/'>{}</a></td>".format(obj.id, display_field_data) td += tmp else: # td += "<td>{}</td>".format(obj) # 如果没有自定义注册字段,则显示对象的内容verbose_name td += "<td><a href='{}/change/'>{}</a></td>".format(obj.id, obj) # 没有list_display列表,就直接添加修改a标签 return mark_safe(td) ``` #### 创建修改数据模板 在djadmin应用的templates/djadmin/模板文件夹中,创建table_edit.html模板 ![BLOG_20181204_112643_79](/media/blog/images/2018/12/BLOG_20181204_112643_79.png "BLOG_20181204_112643_79.png") 暂时增加下面的内容 ```html {% extends 'djadmin/base.html' %} {% load djadmin_tags %} {% block title %} 数据表修改 - 后台管理 {% endblock %} {% block content %} <h1 class="page-header">{{ app_name }} - {{ model_name }} - 修改数据</h1> {% endblock %} ``` #### 创建修改数据视图 修改djadmin的views.py增加`table_change(request, app_name, model_name, obj_id)`视图 ```python # 数据修改 @login_required def table_change(request, app_name, model_name, obj_id): return render(request, 'djadmin/table_edit.html', locals()) ``` #### 增加修改数据url 在djadmin应用的urls.py中,增加一条url ```python from django.urls import path from djadmin.views import index, user_login, user_logout, table_detail, table_change app_name = 'djadmin' urlpatterns = [ path('login/', user_login, name='user_login'), # djAdmin登录 path('logout/', user_logout, name='user_logout'), # djAdmin登出 path('', index, name='index'), # djAdmin主页 path('<str:app_name>/<str:model_name>/', table_detail, name='table_detail'), # 数据表详情 path('<str:app_name>/<str:model_name>/<str:obj_id>/change', table_change, name='table_change'), # 数据表修改 ] ``` 此时,访问 http://127.0.0.1:8000/djadmin/crm/customerinfo/ ,已在表格第一列增加a标签,用于跳转数据修改页面 ![BLOG_20181204_112630_60](/media/blog/images/2018/12/BLOG_20181204_112630_60.png "BLOG_20181204_112630_60.png") ![BLOG_20181204_112613_79](/media/blog/images/2018/12/BLOG_20181204_112613_79.png "BLOG_20181204_112613_79.png") 此时的链接为: http://127.0.0.1:8000/djadmin/crm/customerinfo/1/change/ ### 动态ModelForm生成 参考 https://blog.csdn.net/likunkun__/article/details/81949479 创建类的两种方式 #### 创建生成的类 在djadmin应用下创建form_handle.py文件 ```python from django.forms import ModelForm def create_dynamic_model_form(admin_class): """动态生成ModelF""" class Meta: model = admin_class.model fields = '__all__' # 动态生成 dynamic_form = type('DynamicModelForm', (ModelForm,), {'Meta': Meta}) return dynamic_form ``` #### 实例化modelform 修改djadmin应用的views.py的`table_change(request, app_name, model_name, obj_id)`视图 ```python # 数据修改 @login_required def table_change(request, app_name, model_name, obj_id): from .form_handle import create_dynamic_model_form admin_class = site.enable_admins[app_name][model_name] model_form = create_dynamic_model_form(admin_class=admin_class) # 实例化 form_obj = model_form() return render(request, 'djadmin/table_edit.html', locals()) ``` #### 修改模板增加表单 修改djadmin下的table_edit.html增加form显示 ```html {% extends 'djadmin/base.html' %} {% load djadmin_tags %} {% block title %} 数据表修改 - 后台管理 {% endblock %} {% block content %} <h1 class="page-header">{{ app_name }} - {{ model_name }} - 修改数据</h1> <div> {{ form_obj }} </div> {% endblock %} ``` 访问 http://127.0.0.1:8000/djadmin/crm/customerinfo/1/change/ ![BLOG_20181204_112558_17](/media/blog/images/2018/12/BLOG_20181204_112558_17.png "BLOG_20181204_112558_17.png") ![BLOG_20181204_112543_90](/media/blog/images/2018/12/BLOG_20181204_112543_90.png "BLOG_20181204_112543_90.png") 现在动态ModelForm的功能就实现了
很赞哦! (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