Список фильтрации администратора Django по TextField - PullRequest
1 голос
/ 25 августа 2011

Мне нужно отфильтровать список администраторов на основе TextField. Я хочу иметь возможность фильтровать набор запросов для всех объектов, чье значение TextField равно Null.

Я попробовал следующее:

 def filter_for_field(self, request, queryset):

    queryset=queryset.exclude(field__isnull=True)
    return queryset

Я добавил это как метод к моей AdminModel, а затем добавил свойство "actions = ['filter_for_field'].

Я также пытался сделать это без заявления возврата, без игры в кости. Действие отображается в админке, но оно не удаляет объекты с нулевым значением для TextField.

Что я делаю не так?

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 23 февраля 2012

Вы можете использовать пользовательскую функцию FilterSpec для создания пользовательского фильтра администратора. Он доступен в SVN-версии Django прямо сейчас и запланирован на Django 1.4 .

from django.contrib.admin import SimpleListFilter

class IsNullFilter(SimpleListFilter):
   # Human-readable title which will be displayed in the
   # right admin sidebar just above the filter options.
   title = _('Custom filter')

   # Parameter for the filter that will be used in the URL query.
   parameter_name = 'custom_filter'

   def lookups(self, request, model_admin):
       """
       Returns a list of tuples. The first element in each
       tuple is the coded value for the option that will
       appear in the URL query. The second element is the
       human-readable name for the option that will appear
       in the right sidebar.
       """
       return (
           ('True', _('is Null')),
           ('False', _('is not Null')),
       )

   def queryset(self, request, queryset):
       """
       Returns the filtered queryset based on the value
       provided in the query string and retrievable via
       `self.value()`.
       """

       if self.value() == 'True':
           return queryset.filter(costomfield__isnull=True)
       if self.value() == 'True':
           return queryset.filter(costomfield__isnull=False)

Тогда вам нужно передать его в ModelAdmin.list_filter:

class CustomModelAdmin(admin.ModelAdmin):
    list_filter = (IsNullFilter,)
...