Как сделать строку поиска в 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 }} {{ car.make }} {{ 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, который у меня есть, и он отлично работает :)