Modified the filter by tags

This commit is contained in:
JKuijperM 2026-01-29 18:45:20 +01:00
parent 36e0cfaa44
commit abd07919d4
2 changed files with 43 additions and 18 deletions

View File

@ -45,17 +45,15 @@
</select> </select>
</label> </label>
<label for="tag">Filtrar por tag:</label> <label for="tag">Filtrar por tags:</label>
<select name="tag" id="tag" onchange="this.form.submit()"> <div class="active-tags">
<option value="">Todas</option> {% for tag in tags_with_state %}
{% for tag in tags %} <a href="?{{ tag.query }}"
<option value="{{ tag.id }}" class="tag {% if tag.active %}active{% endif %}">
{% if selected_tag == tag.id %}selected{% endif %} {{ tag.name }} {% if tag.active %} ✕{% endif %}
> </a>
{{ tag.name }}
</option>
{% endfor %} {% endfor %}
</select> </div>>
<button type="submit">Filtrar</button> <button type="submit">Filtrar</button>
<a href="{% url 'expense_list' %}">Limpiar</a> <a href="{% url 'expense_list' %}">Limpiar</a>
@ -91,10 +89,11 @@
<td>{{ expense.amount }}</td> <td>{{ expense.amount }}</td>
<td> <td>
{% for tag in expense.tags.all %} {% for tag in expense.tags.all %}
<!-- <span>{{ tag.name }}</span>{% if not forloop.last %}, {% endif %} --> <span class="tag">
<a href="?tag={{ tag.id }}" class="tag">{{ tag.name }}</a> {{ tag.name }}
</span>
{% empty %} {% empty %}
- <span>-</span>
{% endfor %} {% endfor %}
</td> </td>
<td> <td>

View File

@ -1,4 +1,5 @@
from datetime import date from datetime import date
from operator import truediv
from .forms import ExpenseForm, TagForm from .forms import ExpenseForm, TagForm
from .models import Category, Expense, Tag from .models import Category, Expense, Tag
# from dateutli.relativedelta import relativedelta # from dateutli.relativedelta import relativedelta
@ -114,7 +115,9 @@ def expense_list(request):
year = _get_int(request.GET.get('year')) year = _get_int(request.GET.get('year'))
month = _get_int(request.GET.get('month')) month = _get_int(request.GET.get('month'))
category = _get_int(request.GET.get('category')) category = _get_int(request.GET.get('category'))
tag_id = _get_int(request.GET.get('tag'))
tag_ids = request.GET.getlist('tag')
tag_ids = [int(t) for t in tag_ids]
if year: if year:
expenses = expenses.filter(date__year=year) expenses = expenses.filter(date__year=year)
@ -125,8 +128,10 @@ def expense_list(request):
if category: if category:
expenses = expenses.filter(category_id=category) expenses = expenses.filter(category_id=category)
if tag_id: if tag_ids:
expenses = expenses.filter(tags__id=tag_id) expenses = expenses.filter(tags__id__in=tag_ids).distinct()
selected_tags = tag_ids or []
expenses = expenses.order_by('-date') expenses = expenses.order_by('-date')
@ -147,6 +152,26 @@ def expense_list(request):
page_number = request.GET.get('page') page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number) page_obj = paginator.get_page(page_number)
# tags with state
tags_with_state = []
for tag in Tag.objects.filter(owner=request.user):
if tag.id in selected_tags:
new_tags = [t for t in selected_tags if t != tag.id]
active = True
else:
new_tags = selected_tags + [tag.id]
active = False
query = '&'.join([f'tag={t}' for t in new_tags])
tags_with_state.append({
'id': tag.id,
'name': tag.name,
'active': active,
'query': query,
})
return render ( return render (
request, request,
'expenses/expense_list.html', 'expenses/expense_list.html',
@ -162,8 +187,9 @@ def expense_list(request):
'kpi_total': total_amount, 'kpi_total': total_amount,
'kpi_count': expense_count, 'kpi_count': expense_count,
'kpi_categories': category_count, 'kpi_categories': category_count,
'selected_tag': tag_id, 'selected_tags': selected_tags,
'tags': Tag.objects.filter(owner=request.user), 'tags': Tag.objects.filter(owner=request.user),
'tags_with_state': tags_with_state,
}, },
) )