Django에서 자동 완성

12543 단어 djangoajaxpythonwebdev
여러분, 안녕하세요.
이 블로그에서는 Django 관리 인터페이스에서 자동으로 완료하도록 안내합니다.내가 admin인터페이스를 선택한 것은 기존의 정의된 모델에 CRUD(CREATE-READ-UPDATE-DELETE) 보기를 제공하기 때문이다.
자동 완성 기능을 실현하기 위해 저는 crucialfelix의 현재 유지보수 django-ajax-selects을 사용할 것입니다.

설치 프로그램


우리는django 프로젝트를 먼저 만듭니다.
우선 가상 환경 .venv을 만들겠습니다.python -m venv .venv을 통해서만 가상 환경을 만들 수 있습니다.
현재 Windows 환경에 있으므로 가상 환경 .venv\Scripts\activate을 활성화합니다.
이후 pip를 사용하여 djangodjango-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_APPSsettings.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이 있는 기록은 아래 목록으로 표시됩니다.
    읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기