修改預先存在的代碼中定義的類的最好方法是使用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__
爲什麼不只是這樣做跟單繼承?或者實際上是多重繼承,而不是像'__bases__'這樣的魔法屬性瞎搞? – Marcin 2012-01-02 12:46:45
請解釋你的意思,或通過發佈答案來提出自己的解決方案。我自己對這個問題的理解是,OP希望在所有'ManyToManyField'上使用'filter_horizontal',而不必爲每個具有這種字段的模型創建一個'ModelAdmin'子類。 – 2012-01-02 12:58:52
我評論的哪一部分不清楚?唯一不清楚的是爲什麼你建議猴子修補一個庫類而不是使用繼承。 – Marcin 2012-01-02 13:00:37