Дополнительная фильтрация QuerySet при переходе от одного URL к другому
Я изучаю Python Django. Я пытаюсь создать приложение для отслеживания расходов. Я записываю транзакцию расходов и прикрепляю ее к категории и подкатегории. Например, категория - Путешествие, подкатегория - Отель.
Затем я регистрирую транзакцию на определенную дату с указанием категории/подкатегории. Моя модель выглядит следующим образом.
class Categories(models.Model):
category_text = models.CharField(max_length=50)
def __str__(self):
return self.category_text
class SubCategories(models.Model):
category = models.ForeignKey(Categories, related_name="category", on_delete=models.CASCADE)
subcategory_text = models.CharField(max_length=50)
def __str__(self):
return self.subcategory_text
class Transaction(models.Model):
card_source = models.ForeignKey(CardSource, on_delete=models.CASCADE)
subcategory = models.ForeignKey(SubCategories, related_name="subcategory", on_delete=models.CASCADE)
amount = models.DecimalField(max_digits=9, decimal_places=2)
description = models.CharField(max_length=100)
transaction_date = models.DateField('Date')
def __str__(self):
return self.description + ' on ' + str(self.transaction_date) + ' via ' + str(self.card_source)
Мой вид index.html показывает всю сумму всех расходов по категориям за последние 30 дней.
# /expenses/<x>days/
def last_xdays(request, num_of_days):
last_xdays_date = date.today() - timedelta(days=num_of_days)
transaction_list = Transaction.objects.filter(transaction_date__gte=last_xdays_date).filter(
transaction_date__lte=date.today())
if not transaction_list:
raise Http404("No transactions found.")
category_list = Categories.objects.annotate(category_sum=Sum('category__subcategory__amount', filter=Q(
category__subcategory__id__in=transaction_list))).filter(category_sum__gt=0)
return render(request, 'expenses/index.html',
{'category_list': category_list, 'transaction_list': transaction_list})
Требование: Когда я нажимаю на категорию, она должна переходить на url [/expenses/30days/Travel][1], показывая сумму всех расходов по подкатегории в этой категории.
Шаблон:
{% for category in category_list %}
<tr>
<td><a href="{% url 'expenses:category' category.id %}">{{ category.category_text }}</a></td>
<td>{{ category.category_sum }}</td>
{% endfor %}
Например, когда я нажимаю на категорию "Путешествия", она должна показать мне расходы, суммированные на уровне подкатегорий, таких как "Отель", "Авиабилеты", но только за последние 30 дней. Проблема заключается в том, как узнать, что исходный вид уже отфильтрован за 30 дней? Поэтому, когда я фильтрую расходы на уровне подкатегорий, я рассматриваю только расходы, сделанные за последние 30 дней
У меня есть еще фильтр в верхней части страницы, например, фильтр расходов за последние 90 дней. В этом случае представление будет суммировать все расходы по категориям, сделанные за последние 90 дней. Опять же, когда я нажимаю на категорию, мне нужно получить все расходы для этой категории за последние 90 дней и показать их суммированными на уровне подкатегорий.
Проблема в том, что когда я нажимаю на категорию, как узнать существующий фильтр по дате, т.е. если просмотр фильтруется за последние 30 дней или 60 дней или 90 дней и т.д.? Также, как перейти на url типа [https:///expenses/60days/Travel]?
Допустим, у вас есть URL-адрес следующего вида:
/expenses/60days/
Вы можете поместить это в ваши HTML ссылки:
<a href="{{ sub_category }}">
Появляется
<a href="travel">
Это то же самое, что и
<a href="/expenses/60days/travel/"
Без префиксной прямой косой черты ссылка становится относительной, и щелчок по ней просто добавляет 'travel' к текущему URL.