Python Web开发学习

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

2018-12-04  本文已影响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的功能就实现了

上一篇 下一篇

猜你喜欢

热点阅读