2013-03-27 47 views
2

在Django管理員中,我想真的很喜歡能夠在列表顯示中顯示可編輯的ManyToManyField。Django admin:ManyToManyField in list_editable?

它不一定需要是完整的ManyToManyField控件 - 只需保存一個值就足以滿足列表顯示的目的(儘管底層值本質上是多對多的)。

我的模型看起來是這樣的:

class Item(models.Model): 
    name = models.CharField(max_length=500) 
    colour = models.ManyToManyField(Colour, related_name='primary_colour') 

如果我嘗試這admin.py

class ItemAdmin(admin.ModelAdmin): 
    list_display = ('name', 'colour') 
    list_editable = ('colour') 

然後我得到這個錯誤:

'ItemAdmin.list_display[6]', 'colour' is a ManyToManyField which is not supported. 

任何方式在全部,我可以顯示一個可編輯的ManyToManyField快速editi ng在列表中顯示?

我發現此相關的問題,這也解釋瞭如何使這些值在列表顯示中可見,但不可編輯:ManyToManyField widget in a django admin change list?

回答

1

您可以輕鬆地添加自定義視圖您的管理網址,並添加所需的HTML/JavaScript的/ AJAX。這裏的基本知識:

class ItemAdmin(admin.ModelAdmin): 
    # regular stuff 

    def render_foo(self, obj): 
     # add this to your list_display 
     html = '<stuff><input/submit action></stuff>' 
     return mark_safe(html) 

    def get_urls(self): 
     urls = super(ItemAdmin, self).get_urls() 
     extra_urls = patterns('', 
      (r'^process_foo/$', self.admin_site.admin_view(self.process_foo)), 
     ) 
     return extra_urls + urls 

    def process_foo(self, request): 
     if not request.is_ajax(): 
      raise Http404 
     foo = request.GET.get("attr") 
     # process m2m 
     # return some json 
+0

謝謝!我想我在這裏只需要一點點指導:我可以像現在這樣工作,但我應該在'render_foo'中放置什麼?它應該是一個帶有選擇列表的表單,用戶可以選擇多種顏色並通過Ajax提交給'process_foo',那麼這個想法是什麼? – Richard 2013-03-27 10:53:15

+0

你不需要一個實際的表單來提交數據,只需要使用你需要的任何東西,並用ajax把數據發送到後端,不要忘記驗證它。 HTML5 [數據屬性](http://ejohn.org/blog/html-5-data-attributes/)是處理數據的一種很好的選擇性方式,您可以使用jquery或原始javascript onclick更新屬性或選擇更改。 – 2013-03-27 12:13:02