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

时间:2010-01-31 04:05:10

标签: django django-admin

有没有办法扩展另一个应用程序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代码的情况下执行此操作?

4 个答案:

答案 0 :(得分:9)

以下是我在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)

答案 1 :(得分:5)

首先{p> Unregister Comment模型。

答案 2 :(得分: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)

希望有助于(或至少提出一个想法):)

答案 3 :(得分:0)

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

它提供了一些易于使用的功能和装饰器,以非常灵活的方式实现您所请求的功能。该文档在解释为什么使用这种方法比直接继承更好时做得非常好。

它还支持向多个领域注入双向。