Django报错django.contrib.admin.sites.AlreadyRegistered

发布时间 2023-09-09 23:23:20作者: 九尾cat

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)