В django-admin, как я могу установить фильтр по умолчанию? - PullRequest
4 голосов
/ 02 января 2012

Виджет по умолчанию для ManyToManyFields в django-admin сложен в использовании.Я могу установить filter_horizontal для отдельных полей и получить более приятный виджет.

Как мне установить filter_horizontal в качестве значения по умолчанию для всех ManyToManyFields?

(я бы тожедоволен filter_vertical конечно.)

Я искал решение и не нашел ничего в Google или SO.Я могу думать о том, как сделать это с помощью некоторого метапрограммирования, но если кто-то уже сделал это или где-то в Джанго, я бы хотел услышать об этом.

1 Ответ

4 голосов
/ 02 января 2012

Лучший способ изменить классы, определенные в ранее существовавшем коде, - это использовать mixin . Вам необходимо изменить метод formfield_for_manytomany класса ModelAdmin; метод определен в BaseModelAdmin.

Добавьте следующий код в модуль, который гарантированно будет работать при запуске сервера Django [a 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__
...