Django - Расширение другого приложения ModelAdmin?

Существует ли способ расширить другого приложения 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?

14
задан Felix Kling 31 January 2010 в 15:26
поделиться

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

Я думаю, это может быть сделано лучше, но это должно работать. Чтобы сделать этот подход работать, приложение, содержащее этот файл, должно быть после приложения комментариев в , установленных_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)

Надеюсь, что помогает (или, по крайней мере, дает идею) :)

3
ответ дан 1 December 2019 в 13:33
поделиться

Нерегистрация A Сначала комментировать .

5
ответ дан 1 December 2019 в 13:33
поделиться

Вот как я это делаю в одном проекте для модели 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)
10
ответ дан 1 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: