Мне действительно нравится Yahoo Визуальный редактор YUI .
Как упоминалось в коротких, но приятных документах по «использованию»,
Фильтры также принимают любые произвольные аргументы ключевых слов, которые передаются в
конструктор 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 ()
, потому что его нет. Я споткнулся об этом, потому что забыл, что это метод списка
, а не функция, возвращающая новый список.