2010-01-31 50 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

它提供了一些簡單的使用功能,並實現你在一個非常靈活的方式,要求功能的裝飾。文檔在解釋爲什麼使用這種方法比直接繼承更好的方面做得很好。

它也支持注入雙向許多領域。

相關問題