Aar*_*uyn 14 django django-admin
有没有办法扩展另一个应用程序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)
Run Code Online (Sandbox Code Playgroud)
有没有办法在不修改原始django.contrib.comments代码的情况下执行此操作?
Car*_*yer 10
以下是我在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)
Run Code Online (Sandbox Code Playgroud)
我猜你的文件顶部有这样的内容:
from django.contrib.comments.admin import CommentAdmin
Run Code Online (Sandbox Code Playgroud)
此导入再次执行模型的注册(在此管理文件的最底部)。
一个看起来不太好的想法(我实际上还没有尝试过)可能是:
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...
Run Code Online (Sandbox Code Playgroud)
我想这可以做得更好,但它应该有效。要使此方法发挥作用,包含此文件的应用程序必须位于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)
Run Code Online (Sandbox Code Playgroud)
希望有帮助(或至少提供一个想法):)
| 归档时间: |
|
| 查看次数: |
3018 次 |
| 最近记录: |