我试图在Django中创建一个调用唯一行(使用distinct
)来满足某些过滤条件的查询(使用filter
)
这是使用过的文件:
views.py
def cat_details(request, pk):
current_user = request.user
selected_cat = get_object_or_404(Category, pk=pk)
selected_items = ItemIn.objects.all().filter(item_category=selected_cat).values_list('item_name', flat=True).distinct()
all_cats = Category.objects.all()
cat_count = all_cats.count()
item_count = ItemIn.objects.values_list('item_name', flat=True).distinct().count() # returns a list of tuples..
#all_units = Item.objects.aggregate(Sum('item_quantity'))['item_quantity__sum']
context = {
#'all_units': all_units,
'item_count': item_count,
'cat_count': cat_count,
'selected_items': selected_items,
'selected_cat': selected_cat,
'current_user': current_user,
}
return render(request, 'townoftech_warehouse/cat_details.html', context)
名为selected_items
的变量是问题所在!
以下是我使用此视图功能的方法
HTML
{% extends 'townoftech_warehouse/base.html' %}
{% block content %}
{% load static %}
<div class="card">
<div class="card-header">
الاصناف فى المخزن
</div>
<div class="card-body">
<h3 align="right"> {{ selected_cat }}</h3>
<footer><a href="{% url 'edit_cat' selected_cat.pk%}"><button type="button" class="btn btn-dark">تعديل إسم الفئة</button></a>
<a href="{% url 'category_delete' selected_cat.pk%}"><button type="button" class="btn btn-dark">مسح الفئة</button></a>
</footer>
</div>
</div>
<div style="overflow: auto;height: 280px">
<table class="table table-bordered">
<tbody>
{% for item in selected_items %}
<tr align="right">
<th scope="row"><a href = "{% url 'items' item.pk%}">{{ item.item_name }}</a></th>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<br>
<br>
<div align="right"><a href="{% url 'cat' %}"><button type="button" class="btn btn-danger">رجوع</button></a></div>
{% endblock %}
每当我尝试打开此页面时,我得到的错误是:
错误
NoReverseMatch at /category/15/
Reverse for 'items' with arguments '('',)' not found. 1 pattern(s) tried: ['item\\/(?P<pk>[0-9]+)\\/$']
更新
我已从HTML文件中删除了该链接
已更改
{selected_items%中的项目%} {{item.item_name}} {%endfor%}
就像
{% for item in selected_items %}
<tr align="right">
<th scope="row">{{ item.item_name }}</th>
</tr>
{% endfor %}
错误消失了,但它现在给我一个空值列表!
答案 0 :(得分:2)
selected_items
变量包含字符串对象列表(项目名称)。字符串没有pk
属性,因此模板中的item.pk
不返回任何内容。
您可以将values_list
传递给对象的模板列表。如果您使用的是postgres,则可以使用带有参数的distinct()
。
selected_items = ItemIn.objects.all().filter(item_category=selected_cat).distinct('item_name')
否则,您可以尝试将values
与'item_name', 'pk'
:
selected_items = ItemIn.objects.all().filter(item_category=selected_cat).values('item_name', 'pk').distinct()