【问题标题】:Django - Queryset results not displaying in templateDjango - 查询集结果未显示在模板中
【发布时间】:2021-11-17 23:39:13
【问题描述】:

我正在学习 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 中的查询返回这个(在 shell 中运行):

<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>

我已尝试按照 here 的说明进行迭代,我已使用 dictionary = {i: d for i, d in enumerate(queryset)} 重新组织 result,以及我能找到的任何其他方法,但它不起作用,我知道问题必须出在 result我正在传递给渲染,或者在{% for item in result %},但我非常坚持这一点,我花了几个小时在这上面,但仍然没有结果。我需要一双新鲜的眼睛来看看并告诉我我做错了什么。

【问题讨论】:

  • 请哪个视图返回给定的模板
  • 对不起,我没说清楚,显示模板的视图是search_results_primers
  • 从 Primer 查询对象中移除 .values 查询表达式并重试
  • 如果我从查询中删除 .values() ,它会返回:&lt;QuerySet [&lt;Primer: Ha-9-F&gt;, &lt;Primer: Ha-9-R&gt;, &lt;Primer: Ha-10-F&gt;, &lt;Primer: Ha-10R&gt;, &lt;Primer: Ha-33-F&gt;, &lt;Primer: Ha-33R&gt;, &lt;Primer: Ha-24-F&gt;, &lt;Primer: Ha-24R&gt;, &lt;Primer: Ha-4-F&gt;, &lt;Primer: Ha-4-R&gt;, &lt;Primer: Ha-3-F&gt;, &lt;Primer: Ha-3-R&gt;, &lt;Primer: Ha-31-F&gt;, &lt;Primer: Ha-31R&gt;, &lt;Primer: Ha-23-F&gt;, , '...(remaining elements truncated)...']&gt; 这不是我想要的结果。我需要在“primer_name”字段中包含值“Ha”的所有行,而不仅仅是“primer_name”列中的值。
  • 请发帖search_results_primers查看

标签: python django templates view django-queryset


【解决方案1】:

由于在上下文中,查询集是在关键字query 中传递的,因此您需要在模板中使用相同的关键字:

{% for item in query %}
    ...

关于这个错误:

没有返回 HttpResponse 对象。它返回 None 。

如果filter_by 不是“primer_name”,这可能发生在search_results_primers,导致您的视图不返回任何内容。要解决此问题,请确保您的视图在 filter_by 不是 primer_name 时返回响应。

【讨论】:

  • 谢谢!!!有效!我知道这一定是一个小错误,但我就是找不到!而且您对 ValueError 错误也是正确的,我还没有添加所有选项,所以它给了我那个错误,我添加了一个简单的 else 语句,以便在开发和解决问题时给它那个选项。再次感谢!!!
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2020-10-17
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多