#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. Я попробовал то, что вы мне сказали, но теперь это работает, я добавил то, что я пробовал в своих ответах