Как правильно выполнить поиск в Django?

Я совсем новичок в Django. И у меня возникла проблема с реализацией поиска. Я просмотрел довольно много материала и перепробовал множество вариантов, но ничего не вышло. Я хочу реализовать поиск так, чтобы он искал по модели товара. Вы можете помочь мне с этой проблемой?


views.py

from django.shortcuts import render
from .filters import *
from .models import index
from .forms import *

# Create your views here.

def indexViews(request):
    search = request.GET['search']
    indexAll = index.objects.all

    if search == None:
        posts = index.objects.filter(model__in=search)
    else:
        posts = index.objects.all()
    index_filter = IndexFilter(request.GET, queryset=all)
    context = {
        'index_filters': index_filter,
        'all': indexAll
    }
    return render(request, 'index.html', context)


models.py

from django.db import models

# Create your models here.


class index(models.Model):
    BRAND = [
        ('apple', 'apple'),
        ('samsung', 'samsung'),
        ('huawei', 'huawei'),
    ]
    brand = models.CharField(max_length=20, choices=BRAND)
    model = models.CharField(max_length=50, default='None')
    price = models.FloatField(max_length=10, default=0.0)
    image = models.URLField()

    class Meta:
        verbose_name = 'Product'
        verbose_name_plural = 'Products'

    def __str__(self):
        return self.model


urls.py

from django.urls import path
from .views import *

urlpatterns = [
    path('', indexViews, name='index')
]


index.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="get" action="{% url 'index' %}">
        {{ index_filters.form }}
        <input type="search" placeholder="Search" name="search" class="form-control">
        <button class="btn btn-sm btn-danger" type="submit">Submit</button>
    </form>
    {% for indexViews in index_filters.qs %}
        <img src="{{ indexViews.image }}" width="200" alt="">
        <div class="product">
            Model: {{ indexViews.model }}
            <br>Category: {{ indexViews.brand }}
            <br>Price: {{ indexViews.price }} $
            <br>----------------------------------
        </div>
    {% endfor %}
</body>
</html>

Попробуйте прочитать о Django-GCBV ListView. Больше здесь: https://docs.djangoproject.com/en/4.1/topics/class-based-views/mixins/#listview-working-with-many-django-objects

в вашем случае:

def indexView(ListView):
    model = Index
    
    def get_queryset(self, *args, **kwargs):
        queryset = super().get_queryset(*args, **kwargs)
        if self.request.GET.get('search'):
            queryset = queryset.filter(model=self.request.GET['search'])
        return queryset

    def get_context_data(self, *args, **kwargs):
        return super().get_context_data(*args, **kwargs) | {'index_filter': IndexFilter(self.request.GET)}
Вернуться на верх