Django - 扩展另一个应用程序ModelAdmin?

Aar*_*uyn 14 django django-admin

有没有办法扩展另一个应用程序ModelAdmin?

我有一个使用django.contrib.comments提供的功能的项目.

CommentsAdmin ModelAdmin类具有:
actions = ["flag_comments", "approve_comments", "remove_comments"]

我想在我的项目中扩展CommentsAdmin ModelAdmin以包含一个动作ban_user.

我已经尝试NewCommentsAdmin(CommentsAdmin)在我的admin.py文件中创建自己的对象并注册它,但我收到通知'AlreadyRegistered at /admin/' 'The model Comment is already registered'.

class NewCommentAdmin(CommentAdmin):
    actions = ['ban_user']

    def ban_user(self, request, queryset):
        pass

admin.site.register(Comment, NewCommentAdmin)
Run Code Online (Sandbox Code Playgroud)

有没有办法在不修改原始django.contrib.comments代码的情况下执行此操作?

Car*_*yer 10

以下是我在User模型的一个项目中的使用方法.在我的应用程序的admin.py中:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    # ...

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Run Code Online (Sandbox Code Playgroud)


oza*_*zan 5

注销的Comment第一款车型.


Fel*_*ing 4

我猜你的文件顶部有这样的内容:

from django.contrib.comments.admin import CommentAdmin
Run Code Online (Sandbox Code Playgroud)

此导入再次执行模型的注册(在此管理文件的最底部)。

一个看起来不太好的想法(我实际上还没有尝试过)可能是:

from django.contrib.comments.models import Comment
from django.contrib import admin
from django.contrib.admin.sites import NotRegistered

# Try to unregister the Comment model 
# that was registered via the auto_discover method
try:
    admin.site.unregister(Comment)
except NotRegistered:
    pass

# Now we can load the CommentAdmin (which reregisters the admin model)
from django.contrib.comments.admin import CommentAdmin

# We have to unregister again:
try:
    admin.site.unregister(Comment)
except NotRegistered:
    pass

# Now your stuff...
Run Code Online (Sandbox Code Playgroud)

我想这可以做得更好,但它应该有效。要使此方法发挥作用,包含此文件的应用程序必须位于INSTALLED_APPS.

现在到你的班级。我认为如果你这样写,actions = ['ban_user']你实际上会覆盖父类中的所有操作。我认为这是重写该get_actions方法的最简单方法:

class NewCommentAdmin(CommentAdmin):

    def get_actions(self, request):
        actions = super(NewCommentAdmin, self).get_actions(request)

        # Do some logic here based on request.user if you want 
        # to restrict the new action to certain users
        actions.append('ban_user')

        return actions

    def ban_user(self, request, queryset):
        pass

admin.site.register(Comment, NewCommentAdmin)
Run Code Online (Sandbox Code Playgroud)

希望有帮助(或至少提供一个想法):)