Django простой поиск с представлениями и формами на основе классов.py

Я пытался сделать вариацию того, что сделал Уильямс Винсент на этой странице: https://learndjango.com/tutorials/django-search-tutorial . Я использую Django 3.2, так что если есть модификации, которые мне нужно сделать, я их не определил. У меня возникли некоторые проблемы. Вот что я сделал, и это работает просто отлично.

my_search.html:

{% extends "base.html" %}
{% block body %}
    {% for city in object_list %}
      <li>
        {{city.name}} &emsp; {{city.city_no}}  
      </li>
    {% endfor %}
{% endblock %}

views.py:

from django.views.generic import ListView
from .models import City

class SearchResutlsView(ListView): # test version 
    model = City
    template_name = "search_results.html"

    def get_queryset(self):
        return City.objects.filter(name__icontains='Boston')

Теперь пришло время добавить forms.py, но когда я внес нижеприведенные изменения в код, он не работает. Чего мне не хватает? Ошибки не отображаются. Я получаю пустой html.

{% extends "base.html" %}
{% block body %}
  <form class="d-flex" method='get' action="{% url 'city:search_results' %}">
    {{ form }}
        <button class="btn btn-outline-success" type="submit" value="qu">Search Name</button>
  </form>    
   {% for city in city_list %}
    <li>
        {{city.name}} &emsp; {{city.city_no}}  
    </li>
   {% endfor %}
{% endblock %}

forms.py

from django import forms
class SearchForm(forms.Form):
    q = forms.CharField(label='Search label', max_length=50, strip=True)

views.py

from django.views.generic import FormView, ListView
from .models import City

class SearchResutlsView(FormView):
   model = City
   form_class = SearchForm
   template_name = "city/search_results.html"

   def get_queryset(self):
       query = self.request.Get.get("q")
       if query:
           city_list = City.objects.filter(name__icontains=query)
       else:
           city_list = City.objects.none()
       return  city_list

Во-первых, ваш метод должен быть POST, а не get.

Во-вторых, необходимо добавить CSRF-токен.

что-то в этом роде:

{% extends "base.html" %}
{% block body %}
  <form class="d-flex" method='post' action="{% url 'city:search_results' %}">
    {% csrf_token %}
    {{ form }}
        <button class="btn btn-outline-success" type="submit" value="qu">Search Name</button>
  </form>    
   {% for city in city_list %}
    <li>
        {{city.name}} &emsp; {{city.city_no}}  
    </li>
   {% endfor %}
{% endblock %}

и в views.py

query = self.request.POST.get("q")
Вернуться на верх