有没有办法扩展另一个应用程序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代码的情况下执行此操作?
答案 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)
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
它提供了一些易于使用的功能和装饰器,以非常灵活的方式实现您所请求的功能。该文档在解释为什么使用这种方法比直接继承更好时做得非常好。
它还支持向多个领域注入双向。