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

#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/ :