2012-01-02 102 views
4

django-admin中默認的ManyToManyFields小部件很難使用。我可以在單個字段上設置filter_horizontal並獲得更好的小部件。在django-admin中,如何將filter_horizo​​ntal設置爲默認值?

如何在所有ManyToManyFields上將filter_horizontal設置爲默認值?

(我也很樂意與課程的filter_vertical。)

我搜索周圍的解決方案,並沒有發現任何關於谷歌左右。我可以考慮如何用一些元編程來做到這一點,但如果有人已經這樣做,或者如果它在Django某處,我很樂意聽到它。

回答

4

修改預先存在的代碼中定義的類的最好方法是使用mixin。您需要修改ModelAdmin類的formfield_for_manytomany方法;該方法是defined in BaseModelAdmin

添加以下代碼有保證運行的模塊中,當你的Django服務器啓動[你自己的應用程序之一的models.py]:

from django.contrib.admin.options import ModelAdmin 
from django.contrib.admin import widgets 
class CustomModelAdmin: 
    def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
     """ 
     Get a form Field for a ManyToManyField. 
     """ 
     # If it uses an intermediary model that isn't auto created, don't show 
     # a field in admin. 
     if not db_field.rel.through._meta.auto_created: 
      return None 
     db = kwargs.get('using') 

     if db_field.name in self.raw_id_fields: 
      kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel, using=db) 
      kwargs['help_text'] = '' 
     else: 
      kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, False) # change second argument to True for filter_vertical 

     return db_field.formfield(**kwargs) 

ModelAdmin.__bases__ = (CustomModelAdmin,) + ModelAdmin.__bases__ 
+0

爲什麼不只是這樣做跟單繼承?或者實際上是多重繼承,而不是像'__bases__'這樣的魔法屬性瞎搞? – Marcin 2012-01-02 12:46:45

+0

請解釋你的意思,或通過發佈答案來提出自己的解決方案。我自己對這個問題的理解是,OP希望在所有'ManyToManyField'上使用'filter_horizo​​ntal',而不必爲每個具有這種字段的模型創建一個'ModelAdmin'子類。 – 2012-01-02 12:58:52

+0

我評論的哪一部分不清楚?唯一不清楚的是爲什麼你建議猴子修補一個庫類而不是使用繼承。 – Marcin 2012-01-02 13:00:37

相關問題