返回顶部

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)
复制代码

 

posted @   九尾cat  阅读(241)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示

目录导航