Привет PALS, в этом блоге я собираюсь вести вас, чтобы реализовать автозаполнение в интерфейсе администратора Django. Я выбрал интерфейс администратора, потому что он предоставляет Crud (Create-Read-Update-Deleteet) для определенных моделей из коробки.
Для реализации функции автоматической завершенности я собираюсь использовать django-ajax-selects
в настоящее время поддерживается Crucialfelix Отказ
Настраивать
Давайте начнем с создания проекта Django. Прежде всего, я создаю виртуальную среду .venv
Отказ Вы можете создавать виртуальную среду только python -m venv .venv
. Давайте активируем виртуальную среду .venv \ scripts \ активировать
Как я в настоящее время в среде Windows.
После этого установите Django
и django-ajax-selects
используя PIP.
pip install django django-ajax-selects
После установки библиотек давайте создадим проект Django с именем AutoComplete_demo_Project
Отказ
django-admin startproject autocomplete_demo_project
Впоследствии давайте создадим приложение Django по имени блог
.
python manage.py startapp blog
И зарегистрируйте приложение «Блог»
и 'ajax_select'
в Stall_apps
внутри settings.py
Отказ
# autocomplete_demo_project/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'ajax_select', # new apps 'blog.apps.BlogConfig', ]
После этого давайте определим URLConfs для ajax_select.
Таким образом, он может загрузить необходимые Javascripts, таблицы стилей для автозаполнения.
# autocomplete_demo_project/urls.py from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static from ajax_select import urls as ajax_select_urls urlpatterns = [ path('ajax_select/', include(ajax_select_urls)), path('admin/', admin.site.urls), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Модели и поиску
Мы должны начать через определение моделей, которые позже будут использоваться для наблюдения за автоматическим завершением на панели администратора. Не добавляя никакой сложности, я просто начну с одного поля Имя
В блоге модели.
# blog/models.py from django.db import models from django.utils.translation import gettext_lazy as _ class Blog(models.Model): name = models.CharField(_("Blog"), max_length=50) def __str__(self): return self.name
Давайте также создадим поиск для поля Имя
Что извлекает наиболее подходящий результат, сопоставив запрос введенного при вводе записи на панели администратора. Для этого давайте создадим поиск для нашего поля имя
( namelookup
) в lookup.py
внутри Блог
каталог приложений.
# blog/lookups.py from ajax_select import register, LookupChannel from .models import Blog @register('names') class NameLookup(LookupChannel): model = Blog def get_query(self, q, request): return self.model.objects.filter(name__icontains=q).order_by('name')[:50] def format_item_display(self, item): return u"%s" % item.name
Здесь мы наблюдали два метода внутри нашего Namelookup
сорт. Давайте копать в обоих из них:
get_query
Метод беретQ
Параметр в качестве запроса, который будет использоваться для фильтрации записи в базе данных. Здесь мы использовалиИмя__ icontains
Подход, который будет фильтровать соответствующие записи в БД с дополнительной строкойq
и вернуть фильтрованные записи. Мы также можем действовать сНазвание__startswith
Подход, который пытается сопоставить только начальную строку с записями в БД с запросом Sub StringQ
и вернуть фильтрованные записи. Но давайте просто придерживаемся в одном подходе (имя__ icontains
подход) для реализации автоматического завершения.format_item_display
Методы принимают каждые отфильтрованные записи и отображаютblog.name
(данные), которая является необходимостью в нашем случае с надлежащим стилем. Мы можем переопределить свойства отображения, чтобы она выглядела лучше и соответствовать нашим предпочтениям.
Также обратите внимание, что мы зарегистрировали имя поиска имена
с Регистрация
Декоратор, который позже будет использоваться с формой, чтобы соответствовать требованию с необходимой формой поля I.e. Поле формы с свойством имена
будет соответствовать с вышеупомянутым поиску.
ModelAdmin и Forms
Последующий шаг будет создавать формы Django, которые будут предоставлены как свойство нашему ModelAdmin, которое мы позже создаем в admin.py
Отказ
# blog/forms.py from ajax_select.fields import AutoCompleteField from django import forms from .models import Blog class BlogForm(forms.ModelForm): name = AutoCompleteField('names') class Meta: model = Blog fields = [ 'name' ]
Стоит отметить, что имя поля – это AutoCompletefield.
С недвижимостью имен
Что является названием поиска, которую мы зарегистрированы в Namelookup.
класс внутри Блог/поиск. Отказ Это то, как мы промежуточные формы и поиска, используя
django-ajax-selects.
После этого давайте создадим ModelAdmin.
внутри admin.py
Отказ
# blog/admin.py from ajax_select.admin import AjaxSelectAdmin from django.contrib import admin from .forms import BlogForm from .models import Blog @admin.register(Blog) class BlogAdmin(AjaxSelectAdmin): form = BlogForm
То, что мы сделали здесь, переопределяют по умолчанию Форма
Собственность предоставлена Django Admin и получите его заменить нашими Blogform
Форма объекта.
Также обратите внимание, что использование Блогформ
не ограничивается ModelAdmin для автоматического завершения. Это также может быть использовано в использованных определенных шаблонах, пройдя Форма
внутри контекст
Параметр из . Для этого,
{{ form.media }} {{ form }}
Нам нужно загрузить ((form.media}}
Для загрузки необходимых файлов JS и CSS, определенные ajax_selects
приложение.
Наблюдение
После определения поиска, моделей, форм и ModelAdmin, теперь мы можем сделать миграцию и запустить файлы миграции. Python Manage.py Makemigrations Blog
Опубликовать HOC, давайте запустим эти файлы миграции. Python Manage.py мигрировать
Затем создайте суперпользователь для доступа к интерфейсу администратора, Python Manage.py CreatesuperUser
Затем войдите в 127.0.0.1:8000/ADMIN
Чтобы получить доступ к интерфейсу Admin и перейдите к Блог
модель.
Попробуйте добавить несколько записей, и вы заметите автоматическое завершение работы для вас.
Демонстрация
Я добавил несколько записей в моих моделях.
Давайте попробуем добавить еще одну запись, чтобы соблюдать автоматическое завершение. Обратите внимание, что когда я печатаю А
, записи с буквой А
В их имени появился выпадающий, поэтому пользователь может автозаполнять запись.
Спасибо за чтение.
Оригинал: “https://dev.to/thearjun/implement-autocomplete-in-django-3h20”