Вы могли прочитать книгу , Обитатели Выполняют Убежище или Дизайн Повседневных Вещей , которые говорят об этих проблемах.
Я думаю, вам не следует использовать ModelForm.
Типичным сценарием использования ModelForm является манипулирование данными, а не их поиск.
Вместо этого создайте полностью новую форму на основе нужных вам полей и с флажками, которые пользователь (снимет) установит, чтобы отключить поиск в определенном поле.
Конечно, вы все равно должны использовать варианты, определенные в модели, просто импортировав файл и используя этот список.
Функционально «любой» может быть достигнут просто путем исключения этого конкретного вектора поиска в фильтрацию.
Обычно ModelForm
предназначены для создания и редактирования моделей; в этом случае я не уверен, что это поможет вам намного больше, чем просто заполнение обычной формы:
class AircraftSearch(forms.Form):
search = forms.CharField(max_length=100, required=False)
engine_type = forms.ChoiceField(choices=ENGINE_TYPE)
cat_class = forms.ChoiceField(choices=CAT_CLASS)
Чтобы выполнить поиск, вы просто фильтруете, когда поля не пустые:
def search(request):
if request.method == 'POST':
results = Aircraft.objects.all()
search = request.POST.get('search', None)
if search:
results = results.filter(Q(model=search)|Q(type=search)|Q(extra=search)|Q(manufacturer=search))
engine_type = request.POST.get('engine_type', None)
if engine_type:
results = results.filter(engine_type=engine_type)
cat_class = request.POST.get('cat_class', None)
if cat_class:
results = results.filter(cat_class=cat_class)
return render_to_response('aircraft.html', {'form': AircraftSearch(request.POST), 'aircraft': results})
return render_to_response('aircraft.html', {'form': AircraftSearch()})