2015-09-28 127 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