В этом руководстве мы узнаем, как создать простую поисковую систему с использованием django
и 'django_filter'
, которая позволяет пользователям фильтровать набор запросов на основе их требуемого поиска.
Наш финальный проект будет таким:
Мы сможем найти домашнее животное в параметрах поиска, и 'django_filter'
воспользуется нашим письменным текстом, чтобы выполнить фильтр, чтобы дать нам требуемый результат.
Давай войдем
Установите django-filter
Во-первых, предположим, что у нас есть наш проект и приложение под именами searchProject, searchchapp соответственно. Нам нужно установить 'django_filters'
в наш проект.
установить 'django_filter'
:
pip install django-filter
Затем добавьте 'django_filter'
в свой INSTALLED_APPS
INSTALLED_APPS = [ ... 'django_filters', ]
Модель
from django.db import models class Pet(models.Model): image = models.ImageField(upload_to='pet') pet_name = models.CharField(max_length=200) def __str__(self): return self.pet_name
Мы будем использовать поле pet_name из нашей модели для выполнения нашего запроса.
Фильтр
Создать filters.py in searchapp or our app directory, then add the following code
import django_filters from .models import Pet from django_filters import CharFilter class PetFilter(django_filters.FilterSet): pet_name = CharFilter(field_name='pet_name', lookup_expr='icontains') class Meta: model = Pet fields = ['pet_name']
Это создает FilterSet, позволяющий фильтровать по pet_name и lookup_expr
забавляет, что набираемые буквы нечувствительны к регистру. «Как видите, здесь используется API, очень похожий на ModelForm.
в Django. Как иModelForm
, мы также можем переопределить фильтры или добавить новые, используя декларативный синтаксис».
Вид
from django.shortcuts import render from .models import Pet from .filters import PetFilter # Create your views here. def index(request): myFilter = PetFilter(request.GET, queryset=Pet.objects.all()) pets = myFilter.qs context = { 'pets': pets, } return render(request, 'projx.html', context)
Наша функция индекса будет фильтровать на основе параметра, переданного из формы или опции поиска на странице HTML. «Если аргумент набора запросов не указан, будут использоваться все элементы в диспетчере модели по умолчанию».
Если вы хотите получить доступ к отфильтрованным объектам в ваших шаблонах, вызовите переменную pets
URL-адрес conf
скопируйте и вставьте этот код в файл urls.py вашего приложения
from django.urls import path from .views import index from django.contrib.auth import views as auth_views urlpatterns = [ path('', index, name='index'), ]
Шаблон
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="container"> <h3>Search in Django</h3> <!-- Search form --> <form action="" method="get"> <input class="form-control" name="pet_name" type="text" placeholder="Search Pets" aria-label="Search"> <br> <button type="submit" class="btn btn-primary">Search</button> </form> <br><br> <div class="row"> <div class="col-12"> <table class="table table-image"> <thead> <tr> <th scope="col">Image</th> <th scope="col">Pet</th> </tr> </thead> <tbody> <!-- searchresult --> {% for pet in pets %} <tr> <td class="w-25"> <img src="{{pet.image.url}}" class="img-fluid img-thumbnail" alt="Sheep" width="200" height="10"> </td> <td>{{pet.pet_name}}</td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>
Форма поиска выполняет поиск, а результаты поиска отображает результат из базы данных. Вот и все!
Подписывайтесь на меня в твиттере: @emmakodes
linkedin: https://www.linkedin.com/in/emmanuelonwuegbusi/
Заключение
Надеюсь, это руководство дало вам некоторое представление о том, как использовать 'django_filters'
. Как всегда, официальная документация - лучший источник информации:
Https://django-filter.readthedocs.io/en/stable/index.html
Кроме того, код, используемый в этом руководстве, доступен на GitHub по адресу https://github.com/emmakodes/searchProject.