Django报错django.contrib.admin.sites.AlreadyRegistered
报错django.contrib.admin.sites.AlreadyRegistered: The model Order is already registered with 'goods_service.OrderAdmin'. 错误提示的意思是 Order 模型已经在 goods_service.OrderAdmin 中注册了,因此你不能再次使用 Order 模型注册它。
报错代码
# 创建一个名为OrderAdmin的类,并继承自admin.ModelAdmin。
在类中定义list_display属性,以便在订单列表中显示有用的信息
class OrderAdmin(admin.ModelAdmin):
list_display = ['user', 'total_price', 'is_completed']
#admin.site.register函数中注册Order模型,并将OrderAdmin类作为第二个参数传递。
admin.site.register(Order, OrderAdmin)
## 根据用户查看订单列表,你可以创建一个名为UserOrderAdmin的类,并继承自OrderAdmin。
class UserOrderAdmin(OrderAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(user=request.user)
## 添加已完成订单列表视图,你可以创建一个名为CompletedOrderAdmin的类,并继承自OrderAdmin。在该类中,覆盖get_queryset方法,并返回仅包含当前用户已完成订单的查询集。
class CompletedOrderAdmin(OrderAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(user=request.user, is_completed=True)
admin.site.register(Order, CompletedOrderAdmin)
admin.site.register(Order, UserOrderAdmin)
#首先定义了 list_display 属性以便在订单列表中显示有用的信息。
class CustomOrderAdmin(admin.ModelAdmin):
list_display = ['user', 'total_price', 'is_completed']
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(user=request.user)
admin.site.register(Order, CustomOrderAdmin)
解决思路
要解决这个问题,可以将 CompletedOrderAdmin 类中的 admin.site.register(Order, CompletedOrderAdmin) 行删除,并将 UserOrderAdmin 类中的 admin.site.register(Order, UserOrderAdmin) 行添加到你的代码中
UserOrderAdmin 和 CompletedOrderAdmin 类合并为一个类,并在其中覆盖 get_queryset 方法来实现筛选用户订单和已完成订单。然后,你可以使用这个类来注册 Order 模型:
修改代码为
自测已解决注册冲突的问题
@admin.register(Order)
class CustomOrderAdmin(admin.ModelAdmin):
list_display = ['user', 'name', 'total_price', 'is_completed']
def name(self, obj):
return obj.name
name.short_description = '订单名称'
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(user=request.user)
def get_urls(self):
urls = super().get_urls()
my_urls = [
path('<int:pk>/detail/', self.admin_site.admin_view(self.order_detail_view), name='order_detail'),
]
return my_urls + urls
def order_detail_view(self, request, pk):
order = get_object_or_404(Order, pk=pk)
items = order.items.all()
context = {'order': order, 'items': items}
# return render(request, 'admin/order_detail.html', context)
return render(request, 'order_detail.html', context)