Я наконец-то запустил поиск автозаполнения, используя приведенные здесь инструкции
https://github.com/xcash/bootstrap-autocomplete
https://bootstrap -autocomplete.readthedocs.io / en / latest /
Он очень прост в использовании и не требует установки какого-либо приложения в settings.py
, и он работает как для начальной загрузки 3, так и для начальной загрузки 4
Есть много других доступных пакетов, но это былопросто и легко для моих нужд.
Я собираюсь объяснить код, который я использовал
page.html
{% block script %}
<script src="https://cdn.rawgit.com/xcash/bootstrap-autocomplete/3de7ad37/dist/latest/bootstrap-autocomplete.js"></script>
<script>
$('.basicAutoComplete').autoComplete(
{minLength: 1}
);
$('.dropdown-menu').css({'top': 'auto', 'left': 'auto'})
</script>
{% endblock %}
.
.
.
.
.
{% if field.name == "from_email" %}
{% render_field field class="basicAutoComplete form-control" %}
{% else %}
{% render_field field class="form-control" %}
{% endif %}
autoComplete
isфункция, вызываемая для выполнения действия, и minLength
определяет минимальную длину текста перед выполнением действия извлечения. Я добавил дополнительный CSS, чтобы исправить выпадающий список автозаполнения, в противном случае это было странно.
Визуализация Jinja продолжала перезаписыватьопределение класса из представлений, поэтому я добавил проверку if для него.
urls.py
from . import views
urlpatterns = [
.
.
.
path('email_autocomplete/', views.email_autocomplete, name='email_autocomplete')
]
Добавил эту строку в urls.py
forms.py
class LeaveForm(forms.Form):
from_email = forms.EmailField(required=True, widget=forms.TextInput(
attrs={
'style': 'width: 400px',
'class': 'basicAutoComplete',
'data-url': "/domain/email_autocomplete/"
}))
Выше приведен код для вводаполе в forms.py
.URL-адрес данных указывает на то, где будет сгенерирован результат JSON.
views.py
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from .models import model
def email_autocomplete(request):
if request.GET.get('q'):
q = request.GET['q']
data = model.objects.using('legacy').filter(email__startswith=q).values_list('email',flat=True)
json = list(data)
return JsonResponse(json, safe=False)
else:
HttpResponse("No cookies")
Это была самая запутанная часть для меня.Запрос GET прост для понимания, но для преобразования данных из model.objects
в форматированный объект JSON потребовалось некоторое время.Хитрость заключалась в том, чтобы использовать
values_list('columnName',flat=True)
при фильтрации данных из базы данных, затем преобразовывать в список с помощью list(data)
и, наконец, использовать JsonResponse
для преобразования его в JSON.
Hopeэто поможет любому, кто хочет простое автозаполнение