如何重写Django的change_list_results.html为管理后台列表新增额外列

实现新增列的修改方案
分两种实现方案,优先推荐无需修改模板的轻量方案,确有高度定制需求再使用模板修改方案。
方案1:无需修改模板(推荐)
绝大多数自定义列的需求不需要重写模板,直接在对应ModelAdmin类中配置即可:
- 在
list_display属性中添加自定义列的标识 - 编写对应自定义列的渲染方法,可自定义表头名称
示例代码:
from django.contrib import admin from .models import 你要管理的模型类 class 你的模型管理类(admin.ModelAdmin): # 原有字段后追加自定义列名 list_display = ('原有字段1', '原有字段2', '自定义列标识') # 编写自定义列的渲染逻辑 def 自定义列标识(self, obj): # obj为当前行的模型实例,可直接调用所有字段和自定义方法 return f"自定义内容:{obj.对应字段名}" # 配置自定义列的表头显示文字 自定义列标识.short_description = "自定义表头" admin.site.register(你要管理的模型类, 你的模型管理类)
方案2:修改change_list_results.html模板
如果需要做高度自定义的渲染,再修改模板,核心修改点如下:
- 调整错误提示行的
colspan值,新增几列就给原有的result|length加几,比如新增1列就用add:1过滤器 - 在行渲染的位置新增对应
<td>标签放自定义内容,放在for item in result前就是第一列,放在后面就是最后一列 - 同步修改模板中
thead部分的表头,新增对应的<th>标签,保证列数对齐
修改后的tbody代码示例(以新增1列放在最前面为例):
<tbody> {% for result in results %} {% if result.form and result.form.non_field_errors %} <!-- 新增1列,所以colspan加1 --> <tr><td colspan="{{ result|length|add:1 }}">{{ result.form.non_field_errors }}</td> </tr> {% endif %} <tr> <!-- 新增自定义列 --> <td> <!-- 可通过result.instance获取当前行的模型实例 --> 自定义内容:{{ result.instance.你要调用的字段 }} </td> {% for item in result %} {{ item }} {% endfor %} </tr> {% endfor %} </tbody>
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

