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}}   {{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}}   {{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}}   {{city.city_no}}
</li>
{% endfor %}
{% endblock %}
и в views.py
query = self.request.POST.get("q")