Django에서 자동 완성
이 블로그에서는 Django 관리 인터페이스에서 자동으로 완료하도록 안내합니다.내가 admin인터페이스를 선택한 것은 기존의 정의된 모델에 CRUD(CREATE-READ-UPDATE-DELETE) 보기를 제공하기 때문이다.
자동 완성 기능을 실현하기 위해 저는 crucialfelix의 현재 유지보수
django-ajax-selects
을 사용할 것입니다.설치 프로그램
우리는django 프로젝트를 먼저 만듭니다.
우선 가상 환경
.venv
을 만들겠습니다.python -m venv .venv
을 통해서만 가상 환경을 만들 수 있습니다.현재 Windows 환경에 있으므로 가상 환경
.venv\Scripts\activate
을 활성화합니다.이후 pip를 사용하여
django
과 django-ajax-selects
을 설치한다.pip install django django-ajax-selects
라이브러리를 설치한 후 autocomplete_demo_project
이라는 django 프로젝트를 만듭니다.django-admin startproject autocomplete_demo_project
다음은 blog
이라는 django 프로그램을 만듭니다.python manage.py startapp blog
'blog'
내 'ajax_select'
에 애플리케이션 INSTALLED_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',
]
다음에 ajax_select
에 URLconfs를 정의합니다. 그러면 필요한 자바스크립트와 스타일시트를 불러와서 자동으로 완성할 수 있습니다.# 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)
모델 및 찾기
우리는 모델을 정의하는 것부터 시작해야 한다. 이 모델들은 나중에 관리 패널의 자동 완성을 관찰하는 데 사용될 것이다.
어떠한 복잡성도 증가하지 않는 상황에서 블로그 모델의 단일 필드
name
부터 시작하겠습니다.# 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
또한 필드 name
에 대한 검색을 만듭니다. 이것은 관리 패널에 기록을 입력할 때 입력한 검색과 일치해서 가장 적합한 결과를 얻을 수 있습니다.이를 위해 name
애플리케이션 디렉토리의 NameLookup
에서 필드 lookup.py
(blog
)에 LookupChannel을 만듭니다.# 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"<span class='blog_name'>%s</span>" % item.name
여기서 우리는 NameLookup
류 중의 두 가지 방법을 관찰했다.이제 두 가지 문제에 대해 자세히 살펴보겠습니다.get_query
방법은 q
매개 변수를 조회로 하고 데이터베이스에 있는 기록을 필터하는 데 사용한다.여기에서 우리는 name__icontains
방법을 사용했다. 하위 문자열로 q
필터 데이터베이스에 일치하는 기록을 조회하고 필터된 기록을 되돌려줍니다.또한 시작 문자열을 DB with sub string query
name__startswith
의 기록과 일치시키고 필터된 기록을 되돌려 주는 q
방법을 계속 사용할 수 있습니다.그러나 우리는 단지 한 가지 방법(name__icontains
방법)으로만 자동 완성을 실현할 수 있다.format_item_display
방법은 모든 필터의 기록을 얻고 blog.name
(데이터)을 나타낸다. 이것은 우리의 사례에서 적당한 양식이 필요하다.표시 등록 정보를 덮어써서 보다 나은 것처럼 보이고 기본 설정과 일치시킬 수 있습니다.names
decorator에 검색 이름 register
을 등록했습니다. 이 이름은 나중에 폼과 함께 사용되며 필요한 폼 필드, 즉 속성 names
의 폼 필드가 상기 검색과 일치합니다.모델 관리자 및 양식
다음 단계는 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
이고 그 속성은 names
이다. 이것은 우리가 NameLookup
내부의 blog/lookups.py
클래스에 등록한 검색 이름이다.이것이 바로 우리가 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에서 제공하는 기본 form
속성을 덮어쓰고 BlogForm
양식 객체로 바꿉니다.또한
BlogForm
의 사용은 ModelAdmin에 국한되지 않습니다.form
에서 context
내부 views.py
매개 변수를 전달하여 이미 사용된 정의 템플릿에서 사용할 수 있습니다.이렇게 해줘서 고맙지만,
{{ form.media }}
{{ form }}
((form.media}}
을 로드하여 ajax_selects
응용 프로그램 정의에 필요한 JS와 CSS 파일을 로드해야 합니다.관찰하다.
검색, 모델, 폼, 모델admin을 정의한 후에 이동 파일을 이동하고 실행할 수 있습니다.
python manage.py makemigrations blog
사후에 이 이전 파일들을 실행합시다.python manage.py migrate
그런 다음 관리 인터페이스에 액세스할 수 있는 수퍼유저를 만듭니다.python manage.py createsuperuser
그리고 127.0.0.1:8000/admin
에 로그인하여 관리 인터페이스에 액세스하고 Blog
모델로 이동합니다.기록을 추가하려고 시도하면, 자동으로 완성되는 것이 일을 쉽게 할 수 있다는 것을 알게 될 것이다.
데모
나는 모델에 약간의 기록을 추가했다.
자동 완성을 관찰하기 위해 다른 기록을 추가해 봅시다.
사용자가 자동으로 기록을 완성할 수 있도록
A
을 눌렀을 때, 이름에 A
이 있는 기록은 아래 목록으로 표시됩니다.읽어주셔서 감사합니다.
Reference
이 문제에 관하여(Django에서 자동 완성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/thearjun/implement-autocomplete-in-django-3h20텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)