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

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

Например, у нас есть две модели:

class City(models.Model):
    title = models.CharField(max_length=200)

и класс школа:

class School(models.Model):
     title = models.CharField(max_length=200)
     city = models.ForeignKey(City)

Мы обычно используем django-autocomplete-light, чтоьы красиво вывести строку выбора города как в админке, так и в фронте. Представьте ситуацию, когда у вас 1000 городов, как это будет выглядеть в админке и при добавлении школы пользователем на сайте.

Используя это django-autocomplete-light этого можно избежать. И так, чтобы применить на сайте всю эту красоту нужно во первых сделать:

pip install django-autocomplete-light

Затем добавить его в setting.py в секцию INSTALLED_APPS:

'dal', 'dal_select2',

 Обязательно перед 'django.contrib.admin'.

Создадим свою вьюху:

 

from dal import autocomplete 
from your_app.models import City
class CityAutocomplete(autocomplete.Select2QuerySetView):
     def get_queryset(self):
         if not self.request.user.is_authenticated(): 
               return City.objects.none() 
         qs = City.objects.all() 
         if self.q: 
               qs = qs.filter(title__istartswith=self.q) 
        return qs

 

В urls.py добавим:

from your_app.views import CityAutocomplete
urlpatterns = [
url(
r'^city-autocomplete/$', CityAutocomplete.as_view(), name='city-autocomplete', ),
]

Ну и для того, чтобы это все отображалось в админке, добавим в admin.py:

from dal import autocomplete

from django import forms

class SchoolAdmin(admin.ModelAdmin):
    model = School
class form(forms.ModelForm):
    class Meta:
        widgets = {
            'city': autocomplete.ModelSelect2(url='city-autocomplete')
        }
admin.site.register(School, SchoolAdmin)

Вот так легко добавляется эта красота. Теперь в админке при добавлении или редактировании объекта в поле city будет автозаполнение при вводе названия города

Если нужно засунуть автозаполнение в Django на фронт, то делаем это так:

{% extends 'base.html' %}
{% load static %}

 

{% block content %}
<div>
<form action="" method="post">
{% csrf_token %}
{{ form}}
<input type="submit" />
</form>
</div>
{% endblock %}

{% block footer %}
<script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script>

{{ form.media }}
{% endblock %}

Обратите внимание на обязательные атрибуты, это {{form.media}} и 'admin/js/vendor/jquery/jquery.js. Именно втаком порядке они должны следовать.

Комментарии ()

  1. Галкин Андрей Викторович 22 января 2020, 11:57 # 0
    Задавайте вопросы в комментариях. Ответим по мере возможности.
    Адрес веб студии
    Позвонить

    Городской: +7(8793)33-16-17
    Мобильный: +7(928)911-74-69

    email веб студии
    Написать

    manager@kmv-it.ru

    Доехать до веб студии
    Приехать

    г.Пятигорск переулок Первомайский 18

    Логотип Кухня сайтов