Как расширить Django формы ChoiceField, чтобы также принимать текст и искать близкие совпадения, чтобы избежать необходимости находить что-то в длинном списке - PullRequest
0 голосов
/ 04 февраля 2020

Я хотел бы улучшить удобство использования формы, которая у меня есть, которая позволяет пользователю выбирать область, которая может быть выделена на карте.

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

Некоторые из записей довольно длинные и несколько слов, например. в идеале «Мидлсбро Южный и Восточный Кливленд» должен отображаться в списке, когда пользователь вводит «Клив» вместе с любыми другими близкими совпадениями.

На данный момент страница выглядит следующим образом

У меня есть простая форма Django: -

class ConstituencyForm(forms.Form):
    description = "Use the dropdown to select an area:-"
    lstRandom = [(0, 'Random')]  
    lstChoices = lstRandom + list(constituency.objects.values_list('id', 'name'))
    ConstituencySelection = forms.ChoiceField(choices=lstChoices, widget=forms.Select(),required=False, label="")

Форма создается и передается в этом фрагменте из представления: -

    frmCons=ConstituencyForm()
    if not request.GET.get("ConstituencySelection") or int(request.GET.get("ConstituencySelection"))==0:
        intConsId = random_cons_view()
        strConsType = "random"
    else:
        intConsId = int(request.GET.get("ConstituencySelection"))
        strConsType = "selected"
    objCons=get_constituency_view(intConsId)

    context={
        "consform" : frmCons,
        "consgeom" : json.loads(objCons[1]),

Появляется здесь в template: -

    <form method='get' action=''>
        Select an area:-<br>
        {{ context.consform }}<br><br>
        Select a maptile:-<br>
        {{ context.tileform }}<br><br>
        <input type="submit" value="Update" >
    </form>

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

Что-то вроде: -
-Изменить форму тип поля для типа, который принимает выбор и свободный текст (например, комбинированное поле в MS Access)
-Использует ли фильтр с «title__contains» в представлении? Могу ли я сохранить все варианты выбора в форме объекта?
-Используйте JavaScript, чтобы распознать событие нажатия клавиш в поле и обновить sh список? Я не совсем разбираюсь в JS, но хотел бы дать ему go.

Какие шаги мне нужно предпринять и как это будет закодировано?

Пожалуйста не могли бы вы помочь мне достичь этого? Большое спасибо большому сообществу,

Фил

1 Ответ

0 голосов
/ 28 февраля 2020

В конце концов мне удалось заставить что-то работать, пройдя курс по JS.

В конечном счете, один только html не приблизится к сочетанию выбора ввода с вводом текста в единый контроль. Комбинация текстового ввода прямо над входом выбора с соответствующими событиями сценария java для синхронизации выбора с тем, что вводит пользователь в текстовом вводе, на мой взгляд, достаточно близко.

Прослушиватель событий отвечает следующим образом: -

При вводе текста (пользователь печатает в поиске соответствия детали) - go через массив параметров выбора и задает для скрытого значение true или false, поскольку входная строка развивается, чтобы все больше фильтровать список, используя метод учета без учета регистра для каждой метки параметра. Свойство размера входных данных выбора также динамически c, показывая от 1 до максимум 5 опций на основе оставшихся опций.

При выбранном изменении ввода или щелчке (пользователь выбирает опцию) устанавливается отдельный ввод текста только для чтения со значением выбранной опции, и пользователь может нажать на соответствующую кнопку, чтобы найти данные для этот вариант.

При нажатии кнопки очистки: для параметров в массиве скрытое свойство сбрасывается в false.

Есть несколько других битов, которые я добавил для улучшения функциональности - например, используйте регулярное выражение для прерывания вход с пунктуацией в нескольких частях совпадает и ищет оба, но это контекстуально для варианта использования.

Код довольно длинный и битый, поэтому я попытался объяснить это решение, исходя из контекста, предполагая, что уместно JS знания. Я был бы рад предоставить более подробную информацию, если у кого-то есть конкретный c вариант использования, с которым он хотел бы получить поддержку.

...