美文网首页Python Web开发学习
【CRM客户关系管理】14.生成动态ModelForm表单功能

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

作者: 吾星喵 | 来源:发表于2018-12-04 11:27 被阅读1次

    个人博客,欢迎查看:https://blog.starmeow.cn/

    Github地址:https://github.com/xyliurui/DjangoCRM

    *动态ModelForm功能实现

    修改数据功能

    数据第一列增加a标签

    修改模板标签build_table_body(obj, admin_class),在根据list_display列表生成数据表时,如果是第一列,则为其增加一个a标签,可以进行数据修改的

    # 显示表数据
    @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模板

    image.png

    暂时增加下面的内容

    {% 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)视图

    # 数据修改
    @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

    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标签,用于跳转数据修改页面

    image.png image.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文件

    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)视图

    # 数据修改
    @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显示

    {% 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/

    image.png image.png

    现在动态ModelForm的功能就实现了

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/sdlmcqtx.html