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

【CRM客户关系管理】14.生成动态ModelForm表单功能

admin2018年12月4日 11:28 Django | Html | Python 1067人已围观

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
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

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