Привет 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”