В этом руководстве мы узнаем, как создать простую поисковую систему с использованием 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.