2015-11-17 70 views
3

我想改變小工具類型我many2many關係「FilteredSelectMultiple」Django管理變化組件類型

我從其他的問題教訓和文檔,這應該做的伎倆

admin.py 
from django.contrib.admin.widgets import FilteredSelectMultiple 
from django.db import models 
from django import forms 

class MyModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
      forms.ModelMultipleChoiceField: {'widget': FilteredSelectMultiple}, 
    } 

不幸的是什麼管理頁面中的更改。任何人都可以幫忙嗎?

回答

5

您的formfield_overrides沒有任何效果,因爲您應該使用模型字段,即models.ManyToManyField而不是表單字段forms.MultipleChoiceField。然而,僅僅將密鑰切換到models.ManyToManyField將不起作用,因爲帶有字段名稱的小部件should be instantiated和布爾值is_stacked

有一對夫婦的其他方法:

要使用單個字段FilteredSelectMultiple,使用filter_horizonalfilter_vertical選項。

class MyModelAdmin(admin.ModelAdmin): 
    filter_horizontal = ('my_m2m_field',) 

要覆蓋所有多對多字段的小部件,您可以覆蓋formfield_for_manytomany

from django.contrib.admin import widgets 

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_manytomany(self, db_field, request, **kwargs): 
     vertical = False # change to True if you prefer boxes to be stacked vertically 
     kwargs['widget'] = widgets.FilteredSelectMultiple(
      db_field.verbose_name, 
      vertical, 
     ) 
     return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) 

不要忘了用你的模型管理員註冊模型。

admin.site.register(MyModel, MyModelAdmin) 
+0

感謝您的回答。 filter_horizo​​ntal片段將完美滿足我的需求。我將它添加到admin.py中,並且在管理表單中沒有更改。是否還需要其他代碼? – caliph

+0

我測試了上面的代碼,它的工作原理。你記得註冊你的模型管理類嗎? – Alasdair

+0

我的不好。我完全忘了。我註冊了它,現在它工作。非常感謝你! – caliph