为何无法在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
相关产品推荐
相关产品推荐

