Django报错django.contrib.admin.sites.AlreadyRegistered
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)