我正在使用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
請注意,如果您嘗試執行此代碼,我可能在重命名內容和刪除多餘的內容時打破了某些內容,但我認爲它應該充分說明我在此嘗試執行的操作。