Существует ли способ расширить другого приложения 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)
Существует ли способ сделать это, не изменяя исходный код django.contrib.comments?
Я думаю, у вас есть что-то Как это в верхней части вашего файла:
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...
Я думаю, это может быть сделано лучше, но это должно работать. Чтобы сделать этот подход работать, приложение, содержащее этот файл, должно быть после приложения комментариев в , установленных_apps
.
Теперь к вашему классу. Я думаю, что если вы пишете действия = ['ban_user']
Вы фактически перезаписываете все действия в родительском классе. Я думаю, что это самый простой способ переопределить метод Get_action
:
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)
Надеюсь, что помогает (или, по крайней мере, дает идею) :)
Вот как я это делаю в одном проекте для модели 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)