Используя 'django-фильтр' с полем CHOICES - нуждаются в опции “Any”

Мне действительно нравится Yahoo Визуальный редактор YUI .

10
задан anonymous coward 21 September 2009 в 16:23
поделиться

1 ответ

Как упоминалось в коротких, но приятных документах по «использованию»,

Фильтры также принимают любые произвольные аргументы ключевых слов, которые передаются в конструктор django.forms.Field .

Это не имело большого смысла, пока я не посмотрел немного дальше. В каталоге ./ django-filter / docs / ref / есть filters.txt , который описывает поля фильтра и поля модели, с которыми они взаимодействуют по умолчанию. (Думаю, у меня есть язык, если нет, поправьте меня).

Итак, мы видим, что ChoiceFilter используется для любого поля «с выбором».

Если заглянуть в документацию Django, здесь важны поля формы и то, как они взаимодействуют с моделями. (Используя Django Forms). Итак, мы находим ChoiceField ( http://docs.djangoproject.com/en/dev/ref/forms/fields/#choicefield ), в котором говорится, что

принимает один дополнительный обязательный аргумент: ChoiceField.choices Итерируемый (например, список или кортеж) двух кортежей для использования в качестве вариантов выбора для этого поля.

Таким образом, вы можете передать ему список, а не только исходный набор вариантов выбора кортежа.

Так что это может быть не pythonic или DRY, но вот как я изменил рассматриваемую модель:

class TicketFilter(django_filters.FilterSet):
    class Meta:
        model = Ticket
        fields = ['assigned_to', 'priority', 'status']

    def __init__(self, *args, **kwargs):
        super(TicketFilter, self).__init__(*args, **kwargs)
        self.filters['priority'].extra.update(
            {
                'choices': CHOICES_FOR_PRIORITY_FILTER
            })

И выше, где были определены мои _CHOICES, я определил эту новую (упомянутую выше) и обязательно добавил исходные варианты выбора до конца:

CHOICES_FOR_PRIORITY_FILTER = [
    ('', 'Any'),
]
CHOICES_FOR_PRIORITY_FILTER.extend(list(TICKET_PRIORITY_CHOICES))

Я использую здесь list (), потому что исходные варианты выбора были созданы в виде кортежа, поэтому я хочу превратить его в список. Кроме того, если вы получаете ошибку NoneType, убедитесь, что вы не пытаетесь присвоить «возвращаемое значение» .extend () , потому что его нет. Я споткнулся об этом, потому что забыл, что это метод списка , а не функция, возвращающая новый список.

8
ответ дан 3 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

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