Проблемы Django с фильтрацией объектов по месяцам и годам

#python #html #django #forms #api

#python #HTML #django #формы #API

Вопрос:

Я создаю веб-сайт на Django и хочу создать страницу в виде архива для объектов Spendings, которые у меня есть в моем models.py файл, я пытаюсь создать форму, в которой пользователи могут выбрать год и месяц, и после того, как они нажмут отправить, я хочу показать им все расходы, которые у них были в этом месяце года. Это мой код из views.py файл

 def archive(request):
    if request.method == 'POST':
        budget = Budget.objects.filter(user=request.user)
        year = datetime.strptime(request.POST['year'], '%Y')
        month = datetime.strptime(request.POST['month'], '%m')
        spendings = Spending.objects.filter(
            user=request.user, date_created__year=year.year, date_created__month=month.month)
        total_spendings = spendings_assembly(spendings)
        return redirect('archive')
    else:
        budget = Budget.objects.filter(user=request.user)
        spendings = Spending.objects.filter(user=request.user)
        total_spendings = spendings_assembly(spendings)
    context = {
        'title': 'Archive',
        'spendings': spendings,
        'total_spendings': total_spendings,
        'budget': budget,
    }
    return render(request, 'users/archive.html', context)
  

и это то, что на моем archive.html файл:

     <div class="container">
        <form method="POST" action="{% url 'archive' %}">
            {% csrf_token %}
            <div class="input-group mb-3">
              <div class="input-group-prepend">
                <label class="input-group-text" for="inputGroupSelect01">Year</label>
              </div>
              <select name="year" class="custom-select" id="inputGroupSelect01">
                <option value="2017">2017</option>
                <option value="2018">2018</option>
                <option value="2019">2019</option>
                <option value="2020">2020</option>
              </select>
            </div>
            <div class="input-group mb-3">
              <select name="month" class="custom-select" id="inputGroupSelect02">
                <option value="01">January</option>
                <option value="02">February</option>
                <option value="03">March</option>
                <option value="04">April</option>
                <option value="05">May</option>
                <option value="06">June</option>
                <option value="07">July</option>
                <option value="08">August</option>
                <option value="09">September</option>
                <option value="10">October</option>
                <option value="11">November</option>
                <option value="12">December</option>
              </select>
              <div class="input-group-append">
                <label class="input-group-text" for="inputGroupSelect02">Month</label>
              </div>
            </div>
            <input type="submit" name="result" value="See the Archive" class="btn btn-warning btn-lg btn-block">
        </form>
        <div class="row">
            <div class="col">
                <h4>Spendings List</h4>
                <hr>
                <table class="table table-hover">
                    <thead class="thead-dark">
                        <tr>
                            {% for sum in budget %}
                            <th>Name</th>
                            <th>Category</th>
                            <th>Amount ({{ sum.currency }})</th>
                            <th>Date Created</th>
                            {% endfor %}
                        </tr>
                    </thead>
                    {% for spending in spendings %}
                        <tr>
                            <td>{{ spending.name }}</td>
                            <td>{{ spending.category }}</td>
                            <td>{{ spending.amount }}</td>
                            <td>{{ spending.date_created|date:"F-d-Y" }}</td>
                        </tr>
                    {% endfor %}
                </table>
            </div>
        </div>
    </div>
  

Это код для объекта spendings из models.py файл:

 class Spending(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    category = models.CharField(max_length=100)
    amount = models.FloatField()
    date_created = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.name
  

Комментарии:

1. Выдает ли это вам какие-либо ошибки, исключения… что-нибудь? Если это так, опубликуйте их, хотя прежде всего я должен сказать вам, что это не должно быть запросом POST

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

3. ДА. Послушайте, вы не пытаетесь загрузить какую-либо информацию, а скорее получить ее. Для этой цели вам не следует использовать POST-запрос, вы должны использовать GET-запросы, потому что это их назначение. Также возвращаемый вами ответ, который является перенаправлением, также может вызывать проблемы, потому что он в основном возвращается в другое представление с запросом GET, и информация, которую вы хотели получить, теряется. На вашем месте я бы заставил представление принимать параметры GET с указанием года и месяца и использовать их для выполнения запроса.

4. Я попробовал то, что вы мне сказали, но теперь это работает, я добавил то, что я пробовал в своих ответах