Как скрыть всю строку, если одно или два поля пусты Django

Как я могу скрыть всю строку, если одно или несколько определенных полей пусты? Например, у меня есть запрос на django, настроенный так, чтобы я мог получить общую прибыль от предметов в менеджере инвентаря. У меня это выглядит следующим образом:

html

{% extends 'portal/base.html' %}
{% block title %}Inventory{% endblock %}
{% block content %}
        <br>
        <div class="row">
          <div class="col">
           <form class="d-flex" role="search" action="/search" method="get">
              <input class="form-control me-2" type="text" name="q" placeholder="Search" aria-label="Search">
              <button class="btn btn-outline-success">Search</button>
            </form>
          </div>
          <div class="col">
           <a class="btn btn-primary me-md-2" href="/newitem" type="button">Input New Purchase</a>
          </div>
        </div>
      </div>
     <table class="table table-striped">
       <thead>
           <tr>
            <th>Breakdown</th>
            <th>Product ID</th>
            <th>Product</th>
            <th>Total Profit</th>
           </tr>
       </thead>
       {% for inventory in inventory %}
       <tr>
        <td><a class='btn btn-success btn-sm' href=''>View Breakdown</a>
        <td>{{inventory.id}}</td>
        <td>{{inventory.product}}</td>
        <td>{{ inventory.Calculate_profit }}</td>
       </tr>
       {% endfor %}
    </table>
{% endblock %}

views.py

@login_required(login_url="/login")
def profitsperitem(request):
    inventory = Inventory.objects.all().order_by('id')

    return render(request, 'portal/profitsperitem.html', {"inventory": inventory})

models.py

@property
    def Calculate_profit(self):
        soldfor = Inventory.objects.filter(soldprice=self.soldprice).aggregate(Sum('soldprice'))['soldprice__sum'] or 0.00 
        paidfor = Inventory.objects.filter(paid=self.paid).aggregate(Sum('paid'))['paid__sum'] or 0.00 
        shipfor = Inventory.objects.filter(shipcost=self.shipcost).aggregate(Sum('shipcost'))['shipcost__sum'] or 0.00

        totalprofit = soldfor - paidfor - shipfor

        return totalprofit

Пока поля модели soldprice, paid и shipcost заполнены в каждой строке базы данных, я могу получить результаты без проблем. Я получаю ошибку, если soldprice или shipcost имеют значение null или none, то есть когда в базу данных ничего не добавлено. Если в одной строке не установлены soldprice или shipcost, ни один из результатов не может быть просмотрен, так как выскакивает эта ошибка: "TypeError at /profitsperitem неподдерживаемые типы операндов для -: 'float' и 'decimal.Decimal'"

Мой вопрос в том, как я могу скрыть всю строку, если один или оба soldprice и/или shipcost пустые?

Я смог обновить представление следующим образом

@login_required(login_url="/login")
def profitsperitem(request):
    inventory = Inventory.objects.filter(soldprice__isnull = False, shipcost__isnull = False).order_by('id')

    return render(request, 'portal/profitsperitem.html', {"inventory": inventory})
    {% for inventory in inventory %}
        {% if inventory.Calculate_profit %}
           <tr>
            <td><a class='btn btn-success btn-sm' href=''>View Breakdown</a>
            <td>{{inventory.id}}</td>
            <td>{{inventory.product}}</td>
            <td>{{ inventory.Calculate_profit }}</td>
           </tr>
        {% endif %}
    {% endfor %}

вы можете вывести строку, только если вы рассчитали цену.

if(soldfor is not None and paidfor is not None and shipfor is not None )
  totalprofit = soldfor - paidfor - shipfor
else totalprofit =None

Также вы можете проверить, имеет ли значение Calculate profit

Чтобы отфильтровать все строки с любым из двух полей null/None используйте запрос, подобный этому

from django.db.models import Q

@login_required(login_url="/login")
def profitsperitem(request):
    inventory = Inventory.objects.filter(
        Q(soldprice__isnull = False) | Q(shipcost__isnull = False)
    ).order_by('id')
    return render(request, 'portal/profitsperitem.html', {"inventory": inventory})
Вернуться на верх