Django - 查询集结果未显示在模板中
Django - Queryset results not displaying in template
我正在学习 Django 并为实验室构建库存应用程序。我的所有模型中都已经有数据,现在我想根据某些条件搜索数据库并将结果显示在 table 中。
首先我要求用户输入搜索词(这部分有效),然后我查询数据库(这也有效)但是当显示结果时,我得到的只是一个空模板。没有错误消息。
这些是我的观点:
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
中查询returns这个(来自运行它在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)...']>
没错,就是我想要的搜索结果,目前还不错。但是它只是 returns 一个空模板,它不显示任何数据。
这是我的模板:
<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 %}
中,但我对此深信不疑,我花了几个小时在这上面,但仍然没有结果。我需要一双新鲜的眼睛来看一看,告诉我我做错了什么。
由于在上下文中,查询集是在关键字 query
中传递的,您需要在模板中使用相同的关键字,因此:
{% for item in query %}
...
关于这个错误:
didn't return an HttpResponse object. It returned None instead.
如果 filter_by
不是 'primer_name',这可能会在 search_results_primers
中发生,导致您的视图 return 没有任何内容。要修复它,请确保当 filter_by
不是 primer_name
时,您的视图 return 是一个响应。
我正在学习 Django 并为实验室构建库存应用程序。我的所有模型中都已经有数据,现在我想根据某些条件搜索数据库并将结果显示在 table 中。 首先我要求用户输入搜索词(这部分有效),然后我查询数据库(这也有效)但是当显示结果时,我得到的只是一个空模板。没有错误消息。
这些是我的观点:
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
中查询returns这个(来自运行它在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)...']>
没错,就是我想要的搜索结果,目前还不错。但是它只是 returns 一个空模板,它不显示任何数据。
这是我的模板:
<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 %}
中,但我对此深信不疑,我花了几个小时在这上面,但仍然没有结果。我需要一双新鲜的眼睛来看一看,告诉我我做错了什么。
由于在上下文中,查询集是在关键字 query
中传递的,您需要在模板中使用相同的关键字,因此:
{% for item in query %}
...
关于这个错误:
didn't return an HttpResponse object. It returned None instead.
如果 filter_by
不是 'primer_name',这可能会在 search_results_primers
中发生,导致您的视图 return 没有任何内容。要修复它,请确保当 filter_by
不是 primer_name
时,您的视图 return 是一个响应。