Форма поиска Django, возвращающая всю модель - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь создать простую форму поиска для представлений классов на основе Django.Кажется, все работает, за исключением того, что результат поиска возвращает всю модель, поэтому очевидно, что поиск / фильтр не работает.Я не могу понять, почему после прочтения здесь кучу уроков и вопросов.

models.py:

class surveys(models.Model):
    FAN = models.SlugField(max_length=100, blank=True, null=True)
    Location = models.CharField(max_length=200, blank=True, null=True)

    def __str__(self):
        return self.FAN

    def get_absolute_url(self):
        return reverse('survey-detail', args=[str(self.FAN)])

views.py:

class Search(generic.ListView):
    template_name = 'datalibrary/search.html'
    model = surveys

    def get_queryset(self):
        try:
            name = self.kwargs['name']
        except:
            name = ''
        if (name != ''):
            object_list = self.model.objects.filter(FAN__icontains == name)
        else:
            object_list = ''
        return object_list

class SearchResults(generic.ListView):
    template_name = 'datalibrary/search_results.html'
    model = surveys

search.html:

{% extends "base_generic.html" %}

{% block content %}
    <form method="get" action="/results/" class="navbar-form pull-right">
        <input type="text" id="searchBox" class="input-medium search-query" name="search" placeholder="Search">
        <input type="submit" class="btn" value="Search" >
    </form>
{% endblock %}

search_results.html:

{% extends "base_generic.html" %}

{% block content %} 
    {{ object_list }}
{% endblock %}

urls.py:

urlpatterns +=[
    path('search/', views.Search.as_view(), name='search'),
    path('results/', views.SearchResults.as_view(), name='search-results'),
]

Любая идея, почему object_list скорее возвращает все значения в моделифильтрация на основе ввода, даже если нет ввода?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

У вас есть name = self.kwargs ['name'], которое не получает никакого 'name', для поиска лучше выбрать входное имя в качестве запроса и показать результаты.

class Search(generic.ListView):
    template_name = 'datalibrary/search.html'
    context_object_name = 'all_search_results'

    def get_queryset(self):
        result = super(Search, self).get_queryset()
        query = self.request.GET.get('search') #your input name is 'search'

        if query:
           object_list = surveys.objects.filter(FAN__icontains=query) #or FAN__contains
           result = object_list
        else:
           result = None    # When no result found

        return result

В HTML,

{% extends "base_generic.html" %}

 {% block content %}
  <form method="get" action="/results/" class="navbar-form pull-right">
     <input type="text" id="searchBox" class="input-medium search-query" name="search" placeholder="Search">
     <input type="submit" class="btn" value="Search" >
  </form>



  {% for result in all_search_results %}
       {{result.add_according_to_the_model}}
  {% empty %}
        <p> No Results <p>
  {% endfor %}

   {% endblock %}

Вы можете показать результаты поиска на той же странице.Однако, если это требуется для вас, вы можете иметь другой HTML.

1 голос
/ 15 марта 2019

Вы ищете что-то под названием self.kwargs['name'], но в вашем представлении такого элемента не будет.

Во-первых, имя поискового ввода в вашем HTML-коде search, а не name.

А во-вторых, self.kwargs - для элементов, захваченных из URL; но это отправляется как форма GET, поэтому вы должны получить ее из строки запроса: self.request.GET['search'].

Сложив это, немного более идиоматически:

def get_queryset(self):
    name = self.kwargs.get('name')
    object_list = self.model.objects.all()
    if name:
        object_list = object_list.filter(FAN__icontains == name)
    return object_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...