个人博客,欢迎查看: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的功能就实现了
网友评论