Переопределить шаблоны ListFilter администратора django

Я хочу переопределить шаблон фильтра администратора django по умолчанию, чтобы использовать мой собственный шаблон на основе этого:

https://github.com/feincms/feincms/blob/master/feincms/templates/admin/filter.html

Я написал свой собственный SimpleListFilterкласс, наследуя от django.contrib.admin.SimpleListFilter

class PublisherStateFilter(admin.SimpleListFilter):
    title = _('Status')
    parameter_name = 'status'
    template = 'admin/blogitty/filter.html'

    [...]

Это работает отлично.

Выпадающий фильтр выбора

Однако я хотел бы использовать один и тот же шаблон для всех фильтров администратора. Есть ли способ переопределить все шаблоны фильтров для данного приложения без необходимости определять пользовательские ListFilterдля каждого отношения ForeignKey и ManyToMany.

С моим проектом как blogitty. Я попробовал оба варианта для шаблона DIR:

blogitty/templates/admin/filter.html

И:

blogitty/templates/admin/blogitty/filter.html

Не повезло :-(

Просмотр исходного кода:

https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1030

    return TemplateResponse(request, form_template or [
        "admin/%s/%s/change_form.html" % (app_label, opts.model_name),
        "admin/%s/change_form.html" % app_label,
        "admin/change_form.html"
    ], context)

https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1569

    return TemplateResponse(request, self.change_list_template or [
        'admin/%s/%s/change_list.html' % (app_label, opts.model_name),
        'admin/%s/change_list.html' % app_label,
        'admin/change_list.html'
    ], context)

Насколько я понимаю. Django ModelAdmin проверяет несколько путей для рендеринга формы изменений или списка изменений для данной модели. Однако для ListFilter дополнительные проверки для загрузки пользовательских шаблонов не выполняются.

https://github.com/django/django/blob/master/django/contrib/admin/filters.py#L60

class ListFilter(object):
    title = None  
    template = 'admin/filter.html'

Обновление — настройки TEMPLATE_DIRS:

BASE_DIR = dirname(dirname(__file__))    

TEMPLATE_DIRS = (
    join(BASE_DIR, 'templates'),
)  

Макет проекта основан на cookiecutter-django Дэниела Гринфельда.


person mishbah    schedule 18.01.2015    source источник


Ответы (1)


Это может помочь

class ClassFilter1(admin.ModelAdmin):
    title = 'Filter Class'
    parameter_name = 'filter-class'

    def lookups(self, request, model_admin):
       # Your Lookups

    def queryset(self, request, queryset):
       # Your Lookups

class FilterClass(admin.ModelAdmin):
    list_filter = (ClassFilter1, ClassFilter2)
    change_list_template = 'polls/change_list_template.html'

И переопределите change_list_template.html и поместите .html в polls/templates/polls

person Jay Dave    schedule 07.02.2017