2015-09-28 105 views
0

我正在使用FeinCMS TreeEditor界面为Django-Mptt树结构创建管理面板。该界面为每个节点提供了一个“操作列”,用于快速添加或移动节点,而无需使用典型的Django管理员操作选择框。Django为FeinCMS操作列创建自定义管理操作

Example inteface from Django/TreeEditor/MPTT app

我所试图做的是添加自定义管理行动,这个集合其通过该节点的芹菜任务然后将儿童增加节点的集合的PK。现有的功能只是链接到该任务的URL(添加/删除/移动)的链接,所以到目前为止,我只是简单地模仿了这一点。

我的解决方案目前包括:

  1. 定义行动,对模型
  2. 创建一个使用此功能,并重定向到变更列表
  3. 视图此视图添加到管理员URL的功能
  4. 将TreeEditor操作列超级添加到ModelAdmin类中
  5. 将操作添加到调用此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 

请注意,如果您尝试执行此代码,我可能在重命名内容和删除多余的内容时打破了某些内容,但我认为它应该充分说明我在此尝试执行的操作。

回答

0

经过深入研究,简单地尝试各种其他解决方案后,我将get_urls和view直接定义到管理界面中,尽管它只是将多个django文件中的代码移动到管理员界面 - 虽然它确实使用管理包装来停止未经身份验证的用户,这是一个改进。

我会在这里留下一份工作代码的副本,以供将来发现此问题的人使用,因为我已经看到TreeEditor等人很少的例子。正在用于更新版本的Django。

class NodeAdmin(TreeEditor): 
    model = Node 
    # <...> Other details removed for brevity 
    def get_urls(self): 
     urls = super(NodeAdmin, self).get_urls() 
     my_urls = [ 
      url(r'^(?P<node_id>[0-9]+)/get_suggestions/$', self.admin_site.admin_view(self.get_suggestions)), 
     ] 
     return my_urls + urls 

    def get_suggestions(self, request, node_id): 
     this_node = Node.objects.get(pk=node_id) 
     get_suggestions(this_node.pk) 
     messages.add_message(request, messages.SUCCESS, 'Requested suggestions for {0}'.format(this_node.term)) 
     redirect_url = urlresolvers.reverse('admin:trinket_node_changelist') 
     return HttpResponseRedirect(redirect_url) 


    def _actions_column(self, obj): 
     actions = super(NodeAdmin, self)._actions_column(obj) 
     # Adds an 'get suggestions' action to the Node editor using a search icon 
     actions.insert(
      0, u'<a title="{0}" href="{1}/get_suggestions"><img src="{2}admin/img/selector-search.gif" alt="{0}" /></a>'.format(
       _('Get Suggestions'), 
       obj.pk, 
       settings.STATIC_URL, 
      ) 
     ) 
     # Adds an 'add child' action to the Node editor using a plus icon 
     actions.insert(
      0, u'<a title="{0}" href="add/?{1}={2}"><img src="{3}admin/img/icon_addlink.gif" alt="{0}" /></a>'.format(
       _('Add child'), 
       getattr(self.model._meta,'parent_attr', 'parent'), 
       obj.pk, 
       settings.STATIC_URL 
      ) 
     ) 
     return actions