Как упоминалось в кратких, но приятных документах по использованию,
Фильтры также принимают произвольные аргументы ключевых слов, которые передаются на
django.forms.Field
конструктор.
Это не имело большого смысла, пока я не посмотрел немного дальше. В каталоге ./django-filter/docs/ref/
есть filters.txt
, который описывает поля фильтра и с какими полями модели они взаимодействуют по умолчанию. (Я думаю, что у меня есть язык прямо здесь, если нет, поправьте меня).
Итак, мы видим, что ChoiceFilter
используется для любого поля «с выбором».
Подчеркнув документацию по Django, здесь важны поля форм и то, как они взаимодействуют с моделями. (Использование форм Django). Таким образом, мы находим ChoiceField (http://docs.djangoproject.com/en/dev/ref/forms/fields/#choicefield), который говорит
Принимает один дополнительный обязательный аргумент:
ChoiceField.choices
Итерация (например, список или кортеж) из двух кортежей для использования в качестве выбора для этого поля.
Таким образом, вы можете передать ему список, а не только исходный набор настроек Tuple.
Так что это может быть не питон или СУХОЙ, но вот как я изменил модель:
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 () здесь, потому что исходные Choices были настроены в кортеже, поэтому я хочу превратить это в список. Кроме того, если вы получаете ошибку NoneType, убедитесь, что вы не пытаетесь присвоить 'возвращаемое значение' .extend()
, потому что его нет. Я споткнулся об этом, потому что я забыл, что это был метод list
, а не функция, которая возвращала новый список.
Если вам известен более простой, более СУХОЙ или «питонический» способ сделать это, пожалуйста, дайте мне знать!