Пользовательский фильтр в администраторе Django на Django 1.3 или ниже

Другим вариантом будет использование набора примитивов из Eclipse Collections . Вы можете легко преобразовать int[] в MutableIntSet в Set или Integer[], как показано ниже, или вы можете использовать MutableIntSet как есть, что будет намного более эффективным в использовании и производительностью памяти.

int[] a = {1, 2, 3};
MutableIntSet intSet = IntSets.mutable.with(a);
Set integerSet = intSet.collect(i -> i);  // auto-boxing
Integer[] integerArray = integerSet.toArray(new Integer[]{});

Если вы хотите перейти непосредственно из массива int в массив Integer и сохранить порядок, то это сработает.

Integer[] integers = 
        IntLists.mutable.with(a).collect(i -> i).toArray(new Integer[]{});

Примечание: я являюсь коммиттером для Eclipse Collections

73
задан Serjik 19 December 2015 в 08:08
поделиться

3 ответа

Спасибо gpilotino за то, что подтолкнули меня в правильном направлении для

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

from django.db import models
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec,DateFieldFilterSpec
from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext as _
from datetime import datetime

class IsLiveFilterSpec(DateFieldFilterSpec):
    """
    Adds filtering by future and previous values in the admin
    filter sidebar. Set the is_live_filter filter in the model field attribute
    'is_live_filter'.    my_model_field.is_live_filter = True
    """

    def __init__(self, f, request, params, model, model_admin):
        super(IsLiveFilterSpec, self).__init__(f, request, params, model,
                                               model_admin)
        today = datetime.now()
        self.links = (
            (_('Any'), {}),
            (_('Yes'), {'%s__lte' % self.field.name: str(today),
                       }),
            (_('No'), {'%s__gte' % self.field.name: str(today),
                    }),

        )


    def title(self):
        return "Is Live"

# registering the filter
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'is_live_filter', False),
                               IsLiveFilterSpec))

Для использования вы можете поместить приведенный выше код в файл filters.py и импортировать его в модель, в которую вы хотите добавить фильтр

57
ответ дан 24 November 2019 в 12:23
поделиться

К сожалению, вы не можете. В настоящее время элементы, не являющиеся полями, не могут использоваться в качестве записей list_filter.

Обратите внимание, что ваш класс администратора не работал бы, даже если бы это было поле, поскольку для кортежа из одного элемента требуется запятая: ('is_live' ,)

3
ответ дан 24 November 2019 в 12:23
поделиться

вы должны написать собственный FilterSpec (нигде не документированный). Вот пример:

http://www.djangosnippets.org/snippets/1051/

23
ответ дан 24 November 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: