在django

时间:2018-05-14 10:42:47

标签: python django

我试图在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 %}

错误消失了,但它现在给我一个空值列表!

1 个答案:

答案 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()