Лучший способ сделать образцовую поисковую форму?

Вы могли прочитать книгу , Обитатели Выполняют Убежище или Дизайн Повседневных Вещей , которые говорят об этих проблемах.

5
задан priestc 10 July 2009 в 03:28
поделиться

2 ответа

Я думаю, вам не следует использовать ModelForm.
Типичным сценарием использования ModelForm является манипулирование данными, а не их поиск.

Вместо этого создайте полностью новую форму на основе нужных вам полей и с флажками, которые пользователь (снимет) установит, чтобы отключить поиск в определенном поле.
Конечно, вы все равно должны использовать варианты, определенные в модели, просто импортировав файл и используя этот список.

3
ответ дан 13 December 2019 в 19:33
поделиться

Функционально «любой» может быть достигнут просто путем исключения этого конкретного вектора поиска в фильтрацию.

Обычно 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()})
8
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

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