Как скрыть всю строку, если одно или два поля пусты 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})