如何在Django Admin模板中使用add标签为列表项添加前缀内容
解决方案
你报错的根本原因是:result是当前页预渲染完成的表格行片段列表,item是单个行的HTML字符串,二者都不是分页器实例,自然不存在start_index属性。可以通过以下两种方案实现需求:
方案1:直接在模板中添加内容(无需修改Python代码)
Django Admin的change_list系列模板上下文自带cl变量,这是当前视图的ChangeList实例,包含分页、列表配置等所有核心数据,你可以直接调用它的属性实现需求:
- 如果要加全局跨页序号:
{% for item in result %} <!-- 你要添加的内容,比如全局序号 --> <td class="custom-col">{{ cl.page.start_index|add:forloop.counter0 }}</td> {{ item }} {% endfor %}
其中forloop.counter0是模板内置循环变量,代表当前循环从0开始的索引,加上当前页的起始索引就是全局序号。
- 如果只需要当前页的顺序标识,直接用
forloop.counter即可:
{% for item in result %} <td class="custom-col">当前页第{{ forloop.counter }}条</td> {{ item }} {% endfor %}
- 如果需要渲染模型实例的业务字段,可以通过
cl.result_list拿到当前页的原始模型实例集合,和result是一一对应的,提前注册一个zip模板过滤器后即可配套使用:
{% for item, obj in result|zip:cl.result_list %} <td class="custom-col">{{ obj.你要展示的字段名 }}</td> {{ item }} {% endfor %}
方案2:通过ModelAdmin配置实现(更符合Django最佳实践)
不需要覆写模板,直接在你的模型对应的Admin类中添加自定义列,插入到列表最前面即可:
from django.contrib import admin from django.utils.safestring import mark_safe from .models import 你的模型类 @admin.register(你的模型类) class 你的模型Admin(admin.ModelAdmin): # 把自定义列放在列表最前面,后面拼接原有列配置 list_display = ('custom_column', *admin.ModelAdmin.list_display) def custom_column(self, obj): # 这里返回你要添加的内容,支持HTML标签 return mark_safe(f"自定义内容 {obj.pk}") # 自定义列的表头名称 custom_column.short_description = "自定义列"
内容的提问来源于stack exchange,提问作者Parsa
相关产品推荐
相关产品推荐

