You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在Django Admin文件中调用order_detail函数?

Django Admin list_display 报错 admin.E108 的解决方法

错误原因

你遇到的admin.E108错误,是因为Django Admin在解析list_display中的order_detail时,找不到对应的可调用对象。Django只会在三个范围内查找list_display的项:

  • Order模型的属性或方法
  • OrderAdmin类自身的属性或方法
  • 能被OrderAdmin类直接访问的可调用对象

你定义的order_detail是全局函数,不在上述查找范围内,所以系统判定它不是合法的list_display项。

解决方法

有两种可行的修改方式:

方式一:将函数移至OrderAdmin类内部作为方法

把order_detail改成OrderAdmin的类方法,这样Django就能直接识别它。同时注意,allow_tags已被Django弃用,建议用mark_safe来标记HTML内容为安全:

from django.utils.safestring import mark_safe
from django.urls import reverse
from django.contrib import admin
from .models import Order, OrderItem

class OrderItemInline(admin.TabularInline):
    model = OrderItem
    raw_id_fields = ['product']

def export_to_csv(modeladmin, request, queryset):
    # 保留你的export_to_csv实现
    pass

class OrderAdmin(admin.ModelAdmin):
    list_display = ['id', 'first_name', 'last_name', 'email',
                    'address', 'postal_code', 'city', 'paid', 'created', 'updated', 'order_detail']
    list_filter = ['paid', 'created', 'updated']
    inlines = [OrderItemInline]
    actions = [export_to_csv]

    def order_detail(self, obj):
        url = reverse('orders:admin_order_detail', args=[obj.id])
        return mark_safe(f'<a href="{url}">View</a>')

admin.site.register(Order, OrderAdmin)

方式二:将全局函数赋值为OrderAdmin类的属性

如果想保留全局函数的定义,只需把它赋值给OrderAdmin的类属性,让Django能在Admin类中找到它:

from django.utils.safestring import mark_safe
from django.urls import reverse
from django.contrib import admin
from .models import Order, OrderItem

class OrderItemInline(admin.TabularInline):
    model = OrderItem
    raw_id_fields = ['product']

def export_to_csv(modeladmin, request, queryset):
    # 保留你的export_to_csv实现
    pass

def order_detail(obj):
    url = reverse('orders:admin_order_detail', args=[obj.id])
    return mark_safe(f'<a href="{url}">View</a>')

class OrderAdmin(admin.ModelAdmin):
    list_display = ['id', 'first_name', 'last_name', 'email',
                    'address', 'postal_code', 'city', 'paid', 'created', 'updated', 'order_detail']
    order_detail = order_detail  # 将全局函数绑定为类属性
    list_filter = ['paid', 'created', 'updated']
    inlines = [OrderItemInline]
    actions = [export_to_csv]

admin.site.register(Order, OrderAdmin)

内容的提问来源于stack exchange,提问作者Ali Mohammadnia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:25:34