#django #django-views #django-forms
Вопрос:
Я пытался сделать вариацию того, что сделал Уильямс Винсент на этой странице: 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}} amp;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}} amp;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
Ответ №1:
Во-первых, Ваш метод должен быть 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}} amp;emsp; {{city.city_no}}
</li>
{% endfor %}
{% endblock %}
и в views.py
query = self.request.POST.get("q")
Комментарии:
1. Спасибо, но это тоже не сработало. Я изменил
method='post'
добавленный HTML{% csrf_token %}
. В views.py.POST.
и добавилsuccess_url = city/search_results/
: