Вы должны быть в состоянии написать фабричную функцию, которая возвращает класс. Класс может быть определен с использованием формы с тремя аргументами type
. Я также не совсем понял, как использовать field_name__contains
. В опубликованном коде явно есть ошибка с отступом.
Это не в моей голове и совершенно без какой-либо отладки
В прошлый раз, когда я писал что-то подобное, к тому времени, когда я начал работать, я пожалел, что беспокоился. Тем не менее, это может быть опыт обучения. Если вы проверяете эти вещи дюжиной, это может стоить вашего времени. В противном случае это может быть случай для другого вида DRY (НЕ повторяйте себя!)
def FilterFactory( model_class, class_name):
class_vars = {}
field_list = model_class._meta.get_fields()
for field in field_list:
field_name = (field.__str__().split('.'))[-1]
if type(field) is model.CharField:
field_name__contains = field_name + '__contains'
class_vars[field_name] = \
django_filters.CharField(field_name=field_name, lookup_expr='iexact')
class_vars[field_name+'_contains'] = \
django_filters.CharField(field_name=field_name__contains, lookup_expr='icontains')
class_vars['Meta'] = type( 'Meta', (object, ), {
"model": model_class,
"fields": "__all__"
}
)
klass = type( class_name, (django_filters.FilterSet, ), class_vars )
return klass
Использование
TestFilter = FilterFactory( Test, 'TestFilter')