Панель поиска в Django не работает: подобный запрос не выполняется - PullRequest
0 голосов
/ 19 сентября 2019

Я занимаюсь разработкой приложения в Django.

У меня есть содержимое базы данных, отображаемое в моем шаблоне glossario.html объявление Я хочу реализовать панель поиска для запроса базы данных и отображениятолько результаты запроса.

Поэтому я настроил панель инструментов в glossario.html

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> 

<div class="topnav">

    <a id="pulsante_ricerca_avanzata" href="#Ricerca_avanzata">Ricerca avanzata</a>

    <div id="blocco_ricerca_semplice" class="search-container">

      <form method="GET" action="{% url 'glossario' %}">

        <input type="text" placeholder="Ricerca terminologia..." name="q" value="{{request.GET.q}}">  
        <button id="cancel_search_button" type=""><i class="fa fa-trash"></i></button>

        <button id="search_button" type="submit"><i class="fa fa-search"></i></button>

      </form>

    </div>

</div>

В views.py подготовилфункция для отображения только результатов запроса:

def vista_ricerca_semplice(request):

    template = "glossario.html"

    query = request.GET.get('q')

    selected_entries = glossary_entry.objects.filter(Q(Lemma_it__icontains=query))

    context = {'selected_entries':selected_entries}


    return render(request, template, context)

Примечание:
Lemma_it - это поле моей модели, которое я хочу найти, и glossary_entry - это название моей модели.
Честно говоря, я ищу команду для выполнения запроса по всем полям модели без ввода

selected_entries = glossary_entry.objects.filter(Q(Lemma_it__icontains=query) | Q(field2__icontains=query) | Q(field3__icontains=query) ...)    

In app / urls.py Я сопоставил URL результатов поиска:

from django.urls import path
from . import views
from .views import vista_ricerca_semplice 

urlpatterns=[
    path('', views.home, name='home'),
    path('glossario', views.glossario, name="glossario"),
    path('glossario', views.vista_ricerca_semplice, name="vista_ricerca_semplice"),
]

Но это просто не работает.Если, например, я ввожу «попытку1», консоль возвращает

[19 / Sep / 2019 18:08:00] «GET / glossario? Q = попытки1 HTTP / 1.1» 200 126941

И обновляет страницу, но нет запроса.Вид не меняется.В чем здесь ошибка?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Я работал над подобным проектом, как у вас, но у меня есть система управления школой.Я реализовал панель поиска, и она работает отлично.

в views.py

def search_student(request):
student_list = DataStudent.objects.all()
student_filter = StudentFilter(request.GET, queryset=student_list)
return render(request, 'accounts/Students/Search/student_list.html', {'filter': student_filter})

и в urls.py

from django.conf.urls import url, include
from . import views
urlpatterns=[
url(r'^search_student', views.search_student, name="search_student")
]

in student_list.html

    {% extends 'base.html' %}
{% block body %}
<div class="container" style="margin-left: 200px;font-size: 20px; padding: 0px 10px;">
  {% load crispy_forms_tags %}
  <form method="get">
    <nav class="container nav navbar-expand navbar" >
      <div style="color:black; font-size:160%">
          <ul class="navbar-nav mr-auto" >
               <li class="nav-item">
              {{ filter.form.name|as_crispy_field  }}
              </li>
              <li class="nav-item">
             {{ filter.form.Class|as_crispy_field  }}
             </li>
             <li class="nav-item">
             {{ filter.form.stream|as_crispy_field  }}
            </li>
            <li style="margin-left:5%"> <button type="submit" style="margin-top:60%;" class="btn btn-primary">Search </button>
            </li>
          </ul>
      </div>
  </nav>
  </form>
  <ul>
    <div class="container" style="margin-left:2px; font-size:15px; padding:3px">
    <table class="table table-hover" border="2">
       <thead class="table-success">
        <tr>
             <td>Reg Number</td>
             <td>Photo</td>
             <td>Name</td>
             <td>Class</td>
             <td>Stream</td>
             <td>Admision No</td>
             <td>Action</td>
         </tr>
       </thead>
       <tbody>
           {% for student in filter.qs %}
         <tr>
           <td>{{ student.admission_no}}</td>

           <td>{% if student.Student_Photo %}<img src="{{ student.Student_Photo.url}}" width="50">{% endif %}</td>
           <td>{{ student.name}}</td>
           <td>{{ student.Class}}</td>
           <td>{{ student.stream}}</td>
           <td>{{ student.admission_no}}</td>
           <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
           <td><a class="btn btn-primary a-btn-slide-text" href="{% url 'singlestudentdetails' pk=student.id  %}"><span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
          <span><strong>View</strong></span></a>
             <a class="btn btn-danger a-btn-slide-text" href="{% url 'deletestudent' pk=student.id %}"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
            <span><strong>Delete</strong></span> </a>
           </td>
            {% endfor %}
         </tr>
       </tbody>
    </table>
    </div>
  </div>
{% endblock %}

Надеюсь, это поможет вам, приятель, счастливое кодирование

0 голосов
/ 20 сентября 2019

решено

Как указывалось, проблема заключалась в том, что у меня было две функции представления, указывающие на один и тот же путь (шаблон).

Этого не может быть.Один шаблон / путь не может быть указан более чем одной функцией просмотра.Поэтому я удалил весь код, связанный с моей предыдущей функцией просмотра vista_ricerca_semplice

Я решил свою проблему, изменив код в urls.py и views.py следующим образом:

В views.py :

def glossario(request):

    query = request.GET.get('q')
    template = "glossario.html" 

    # query executed
    if query:

        query = request.GET.get('q') 
        selected_entries = glossary_entry.objects.filter(Q(Lemma_it__icontains=query))            
        return render(request, template, {'all_entries':selected_entries})

    # no query
    else:

        all_entries = glossary_entry.objects.all 
        return render(request, template, {'all_entries':all_entries})

В Urls.py

urlpatterns=[
    path('', views.home, name='home'),
    path('glossario', views.glossario, name="glossario"),
]
...