Как сделать строку поиска в django?

hello я изучаю django и я пытаюсь сделать некоторый интернет-магазин для обучения. в настоящее время у меня есть проблема в том, как сделать строку поиска в django. У меня есть модель под названием "Car" в моем models.py и она содержит такие поля как название и цена автомобиля, а также у нее есть поле под названием "tag" и я хочу сделать строку поиска, используя это поле. Я хочу, чтобы когда пользователь вводит тег на веб-странице сайта, django искал и показывал товары с тем же тегом. как на других сайтах. Спасибо

я пытался решить свою проблему, читая документы, но это не помогло .

Решение

Вот пример представления и некоторого шаблонного кода, который будет обрабатывать поиск, который вы хотите выполнить (адаптировано из ответа Бидхана Маджи на этот вопрос StackOverflow):

views.py

class SearchView(ListView):
    model = Car
    template_name = 'search.html'
    context_object_name = 'all_search_results'

    def get_queryset(self):
       result = super(SearchView, self).get_queryset()
       query = self.request.GET.get('search')
       if query:
          postresult = Car.objects.filter(tag__contains=query)
          result = postresult
       else:
           result = None
       return result

шаблон

<form method="GET" action="" >
    <input type="search" name="search"> 
    <button type="submit"> Search </button>
</form>

{% for car in all_search_results %}
   <h2>{{ car.year }}&nbsp;{{ car.make }}&nbsp;{{ car.model }}</h2>
   {% comment %} Add whatever else for each Car model returned{% endcomment %}
{% empty %}
   <h2>add something to show no results</h2>
{% endfor %}

Caveat (если ваше tags поле является ManyToManyField)

Приведенное выше представление будет работать до тех пор, пока ваше tag является просто CharField, но если ваше tags поле является ManyToManyField, вам придется изменить строку postresult = Car.objects.filter(tag__contains=query), чтобы она работала через связанную модель Tag (postresult = Car.objects.filter(tags__text__contains=query)).

Вот как это будет выглядеть:

Приложение с именем "tag": models.py

from django.db import models

class Tag(models.Model):
    text = models.CharField(max_length=20)

Приложение с именем "car": models.py

from django.db import models
from tag.models import Tag

import datetime

def year_range():
    this_year = datetime.date.today().year
    return [(r, r) for r in range(
            1860, this_year+2
        )
    ]

class Car(models.Model):
    """model for thoughts that come into my mind"""
    year = models.PositiveSmallIntegerField(
        choices=year_range
    )
    make = models.CharField(max_length=50)
    model = models.CharField(max_length=50)
    tags = models.ManyToManyField(
        Tag, related_name="cars"
    )

views.py

from django.views import generic

from .models import Car


# Create your views here.
class SearchView(generic.ListView):
    model = Car
    template_name = 'search.html'
    context_object_name = 'all_search_results'

    def get_queryset(self):
        result = super(SearchView, self).get_queryset()
        query = self.request.GET.get('search')
        if query:
            postresult = Car.objects.filter(tags__text__contains=query)
            result = postresult
        else:
            result = None
        return result

Шаблон будет таким же, как и выше. Я только что попробовал это в проекте django sandbox, который у меня есть, и он отлично работает :)

Вернуться на верх