我正在使用FeinCMS TreeEditor界面为Django-Mptt树结构创建管理面板。该界面为每个节点提供了一个“操作列”,用于快速添加或移动节点,而无需使用典型的Django管理员操作选择框。Django为FeinCMS操作列创建自定义管理操作
我所试图做的是添加自定义管理行动,这个集合其通过该节点的芹菜任务然后将儿童增加节点的集合的PK。现有的功能只是链接到该任务的URL(添加/删除/移动)的链接,所以到目前为止,我只是简单地模仿了这一点。
我的解决方案目前包括:
- 定义行动,对模型
- 创建一个使用此功能,并重定向到变更列表
- 视图此视图添加到管理员URL的功能
- 将TreeEditor操作列超级添加到ModelAdmin类中
- 将操作添加到调用此URL的集合
当然肯定有比这更好的方法吗?虽然有效,但感觉大量复杂且不干,我相信它会以奇怪的方式破裂。
不幸的是,我只用了一两个月的时间与Django一起工作,所以可能会有一些明显的功能可以使用。我怀疑我可以用get_urls()做些什么,并直接在ModelAdmin中定义函数,或者在注入的HTML中使用代码块来直接调用函数,但我不知道如何以及它是否被认为更好选项。
代码: 我改名一切更简单库<>的书为例,从上面的示例图像去除不相关的功能。
models.py
class Library(models.Model):
def get_books(self):
# Celery task; file omitted for brevity
get_books_in_library.delay(self.pk)
views.py
def get_books_in_library(request, library_id):
this_library = Library.objects.get(pk=library_id)
this_library.get_books_in_library()
messages.add_message(request, messages.SUCCESS, 'Library "{0}" books requested.'.format(this_library.name))
redirect_url = urlresolvers.reverse('admin:myapp_library_changelist')
return HttpResponseRedirect(redirect_url)
urls.py
urlpatterns = [
url(r'^admin/myapp/library/(?P<library_id>[0-9]+)/get_books/$', get_books_in_library, name='get books in library'),
url(r'^admin/', include(admin.site.urls)),
]
admin.py
class LibraryAdmin(TreeEditor):
model = Library
def _actions_column(self, obj):
actions = super(LibraryAdmin, self)._actions_column(obj)
actions.insert(
0, u'<a title="{0}" href="{1}/get_books"><img src="{2}admin/img/icon_addlink.gif" alt="{0}" /></a>'.format(
_('Get Books'),
obj.pk,
settings.STATIC_URL
)
)
return actions
请注意,如果您尝试执行此代码,我可能在重命名内容和删除多余的内容时打破了某些内容,但我认为它应该充分说明我在此尝试执行的操作。