Я пытаюсь реализовать простую функцию поиска в django, но почему-то не могу передать аргумент из своего шаблона в функцию просмотра. У меня ключевая ошибка: KeyError в /artdb/search/, потому что kwargs пуст:
URL.py:
path('search/',views.Search.as_view(),name='search'),
база,.html:
<form class = "form-inline my-2 my-lg-0" name = "search" action = "{% url 'artdb:search' %}" {{ form.as_p }} method = "get">{% csrf_token %}
<input class = "form-control mr-sm-2" type = "text" placeholder = "Search" aria-label = "Search" value = "{{seastr}}">
<button class = "btn btn-outline-success my-2 my-sm-0" type = "submit" value = "{{seastr}}">Search</button>
</form>
просмотров.py:
class Search(ListView):
print("class Search")
model=Person
template_name='artdb/search.html'
context_object_name='ans'
def get_queryset(self):
Pdb().set_trace()
self.seastr=get_object_or_404(Person,name=self.kwargs['seastr'])
return Person.objects.filter(seastr=self.seastr)





Вы не прикрепили имя seastr к своему полю <input>:
<form class = "form-inline my-2 my-lg-0" name = "search" action = "{% url 'artdb:search' %}" {{ form.as_p }} method = "get">{% csrf_token %}
<input name = "seastr" class = "form-control mr-sm-2" type = "text" placeholder = "Search" aria-label = "Search" value = "{{seastr}}">
<button class = "btn btn-outline-success my-2 my-sm-0" type = "submit">Search</button>
</form>Обратите внимание на name = "seastr" в теге <input>.
GET-параметры хранятся не в self.kwargs, а в self.request.GET, поэтому мы можем получить параметр с помощью self.request.GET['seastr'].
Обычно страница с панелью поиска совпадает со страницей с запросом, поэтому поисковый запрос часто по желанию. Поэтому может быть полезно сделать здесь фильтрацию необязательной:
class Search(ListView):
model=Person
template_name='artdb/search.html'
context_object_name='ans'
def get_queryset(self):
q = self.request.GET.get('seastr')
if q is not None:
return Person.objects.filter(seastr=q)
else:
return Person.objects.all()Наконец, обратите внимание, что параметр seastr является частью контекстных данных нет. Вы можете сделать эту часть данных контекста, исправив ее:
class Search(ListView):
model=Person
template_name='artdb/search.html'
context_object_name='ans'
def get_queryset(self):
q = self.request.GET.get('seastr')
if q is not None:
return Person.objects.filter(seastr=q)
else:
return Person.objects.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['seastr'] = self.request.GET.get('seastr')
return contextхорошо спасибо. Я также изменил это: верните Person.objects.filter(firstName__icontains=q), и теперь это работает.
Ну, вы, вероятно, сначала получите фильтрацию страницы без.