2010-01-31 64 views
12

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

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

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

我想在我的项目延长CommentsAdmin的ModelAdmin包括动作ban_user

我试过在我的admin.py文件中创建自己的NewCommentsAdmin(CommentsAdmin)对象并注册它,但我收到一条通知'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) 

有没有办法做到这一点,而无需修改原来的django.contrib.comments代码?

回答

3

我想你有你的文件的开头是这样的:

from django.contrib.comments.admin import CommentAdmin 

此导入执行模式的登记(在该管理文件的最底部)再次。这看起来并不很不错(其实我还没有尝试过)

一个想法可能是:

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... 

我想这可能是做的更好,但它应该工作。要使此方法有效,包含此文件的应用程序必须位于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) 

希望帮助(或者至少给出了一个想法):)

+0

恩,这比需要的复杂得多。只需导入CommentAdmin,对其进行子类化,取消一次注册,并注册您的版本。 – 2010-01-31 16:30:22

+0

@Carl Meyer:你确定吗?我试图让Geodjango的地图小部件在前端工作。为此,我需要导入在我的'admin.py'文件中定义的自定义AdminModel。当我导入这个类时,'admin.site.register'函数再次被执行。这是我的观点。当您尝试导入类时,它会尝试再次注册该模型。你有没有得到它与成功?如果有另一个解决方案,我很高兴在这里。 – 2010-01-31 16:40:06

+0

如果通过两个不同路径导入模块,则模块级代码只执行两次。通常这不应该发生。我不知道GeoDjango是否做了一些有趣的事情,从未使用它。请参阅我的答案,了解我正在制作的简单版本。 – 2010-01-31 16:47:18

9

这里是我如何做到这一点在用户模型中的一个项目。在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) 
0

看一看https://github.com/kux/django-admin-extend

它提供了一些简单的使用功能,并实现你在一个非常灵活的方式,要求功能的装饰。文档在解释为什么使用这种方法比直接继承更好的方面做得很好。

它也支持注入双向许多领域。

相关问题