Django - Результаты кверисетов не отображаются в шаблоне

Я изучаю Django и создаю приложение для инвентаризации в лаборатории. У меня уже есть данные во всех моих моделях, и теперь я хочу выполнить поиск в базе данных на основе некоторых критериев и отобразить результаты в таблице. Сначала я прошу пользователя ввести условия поиска (эта часть работает), затем я делаю запрос к базе данных (это тоже работает), но когда приходит время отобразить результаты, все, что я получаю - пустой шаблон. Никаких сообщений об ошибках.

Вот мои взгляды:

def choose_filter_primers(request):   # this works fine
    if request.method == "GET":
        radiobtn_form = PrimerRadiobtn(request.GET)
        
        if radiobtn_form.is_valid():
            # get value from user input and store it in request.session dict
            request.session['filter_by'] = radiobtn_form.cleaned_data['CHOOSE_FIELD']
            # go to the next step in the search form
            return render(request, 'lab_inventory/filter_primers.html')
    else:
        radiobtn_form = PrimerRadiobtn()
    
    return render(request, 'lab_inventory/choose_filter_primers.html', {'radiobtn_form': radiobtn_form})


def filter_primers(request):    # this works fine
    # get filter field from views.choose_filter_primers
    filter_by = request.session.get('filter_by')

    if request.method == "POST":
        form = FilterPrimerForm(request.POST)# or None)
        if form.is_valid():
            # get value from user input and store it in request.session dict
            request.session['contains'] = form.cleaned_data.get("contains")           
            # go to the next step in the search form
            return render(request, 'lab_inventory/search_results_primers.html')
        else:
            return render(request, 'lab_inventory/choose_filter_primers.html')
    else:
        form = FilterPrimerForm(request.POST)
        context = {'form': form}
        
    return render(request, 'lab_inventory/filter_primers.html', context)


def search_results_primers(request):   # MY PROBLEM IS HERE SOMEWHERE
    search_term = request.GET['contains'] # this variable refers to the value 'Ha'
    filter_by = request.session.get('filter_by') # this variable refers to the value 'primer_name'

    if filter_by == 'primer_name':
        query = Primer.objects.filter(primer_name__contains=search_term).values()
        result = {'query': query}
        
        return render(request, 'lab_inventory/search_results_primers.html', result)

Запрос в search_results_primers возвращает следующее (если выполнить его в оболочке):

<QuerySet [{'id': 303, 'primer_name': 'Ha-9-F', 'primer_seq': '5-TAGCTAACTTGGCCTGAAGCCTC-3', 'purchase_order': 201, 'date_received': datetime.date(2001, 1, 16), 'date_opened': datetime.date(2001, 1, 30), 'date_discarded': datetime.date(2001, 2, 27), 'stored_freezer': '-20/3', 'stored_box': 'H / 2'},
 {'id': 304, 'primer_name': 'Ha-9-R', 'primer_seq': '5-TCTCCCTCCGAAGCAGGTTTCGCGG-3', 'purchase_order': 201, 'date_received': datetime.date(2001, 1, 16), 'date_opened': datetime.date(2001, 1, 30), 'date_discarded': datetime.date(2001, 2, 27), 'stored_freezer': '-20/3', 'stored_box': 'H / 3'},
 {'id': 311, 'primer_name': 'Ha-10-F', 'primer_seq': '5-GTCCTGAATCATGTTTCCCCTGCAC-3', 'purchase_order': 205, 'date_received': datetime.date(2003, 12, 19), 'date_opened': datetime.date(2004, 1, 2), 'date_discarded': datetime.date(2004, 1, 30), 'stored_freezer': '-20/1', 'stored_box': 'F / 7'},]  '...(remaining elements truncated)...']>

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

Это мой шаблон:

    <table id="search-results-primers-table">
      <tr>
        <th>Primer Name</th>
        <th>Primer Sequence</th>
        <th>Purchase Order</th>
        <th>Date Received</th>
        <th>Date Opened</th>
        <th>Date Discarded</th>
        <th>Freezer / Shelf</th>
        <th>Box / Position</th>
      </tr>
      <tbody>
        {% for item in result %}
          <tr>
            <td>{{ item.primer_name }}</td>
            <td>{{ item.primer_seq }}</td>
            <td>{{ item.purchase_order }}</td>
            <td>{{ item.date_received }}</td>
            <td>{{ item.date_opened }}</td>
            <td>{{ item.date_discarded }}</td>
            <td>{{ item.stored_freezer }}</td>
            <td>{{ item.stored_box }}</td>
          </tr>      
        {% endfor %}
      </body>
    </table>

Я пробовал итерацию, как объяснено здесь , я реорганизовал result, используя dictionary = {i: d for i, d in enumerate(queryset)}, и все остальное, что я смог найти, но это просто не работает, я знаю, что проблема должна быть в result, который я передаю для рендеринга, или в {% for item in result %}, но я так застрял с этим, я потратил часы на это и все еще никаких результатов. Мне нужна пара свежих глаз, чтобы взглянуть и сказать мне, что я делаю неправильно.

Поскольку в контексте queryset был передан в ключевом слове query, необходимо использовать это же ключевое слово в шаблоне так:

{% for item in query %}
    ...

Об этой ошибке:

не возвращает объект HttpResponse. Вместо этого он вернул None.

Это может произойти в search_results_primers, если filter_by не является 'primer_name', в результате чего ваше представление не вернет ничего. Чтобы исправить это, убедитесь, что ваше представление возвращает ответ, когда filter_by не является primer_name.

Вернуться на верх