Django - Searchbar в Listview | Как определить и обработать его
Я совсем новичок в django и python. Я хотел бы добавить панель поиска, работающую на моей странице Listview, как я видел на админ-сайте Django.
Я видел много документации по django, много объяснений и много учебников в сети, но я должен сказать, что я запутался и не смог найти решение для моей проблемы. Что я хочу сделать: У меня есть страница с (основанным на классе) ListView, который представляет 5 полей из моей таблицы. Я хотел бы добавить строку поиска, работающую на 2 из этих 5 полей (id объекта и описание), как я видел на сайте администратора Django.
Глядя на документацию и веб, можно найти множество различных предложений для этого (queryset, filter, context, Q...). Лично я хотел бы работать с контекстом. Я пытался восстановить информацию из моей панели поиска, но то, что я реализовал и попробовал с тех пор, не работает. Может ли кто-нибудь помочь мне в этом вопросе? Какова наилучшая практика и подход? Подскажите, как с этим справиться с помощью примера кода? Заранее спасибо!
#HTML
<form method="GET">
<input type="text" name="q" value="" id="searchbar" autofocus>
<input class="button" type="submit" value="Search">
</form>
#View class AircraftListView(ListView):
model = Aircraft
paginate_by = 10
def get_context_data(self, **kwargs):
context = super(AircraftListView, self).get_context_data(**kwargs)
print(context)
filter_set = Aircraft.objects.all()
if self.request.GET.get('searchbar'):
q = self.request.GET.get('searchbar')
print('Hello I am on the right way')
filter_set = filter_set.filter(q=self.aircraft.air_tailnumber)
else:
print('I took the wrong way')
return context
Поскольку вы не хотите использовать фильтр django, я попытаюсь привести пример для вашего представления. Вместо переопределения get_context_data
, которое на самом деле нужно для дополнительного контекста, переопределите метод get_queryset
в вашем ListView
. Что-то вроде:
def get_queryset(self):
queryset = super().get_queryset()
search_text = request.GET.get("searchbar")
if search_text:
return queryset.filter(your_model_field=search_text)
return queryset