Почему DJANGO требует сделать два POST запроса, перед тем как удалить запись из БД?
Помогите, пожалуйста, решить проблему. У меня есть страница истории, на которой выводится записи из БД. У каждой записи есть кнопка "удалить", с помощью нее я передаю методом POST id записи и делаю delete(). Но это почему-то работает неправильно, чтобы удалить запись я должен послать два любых POST запроса на странице (либо два раза нажать на "удалить", либо один раз "удалить" и один раз на кнопку применения фильтра по месяцам). Вот код:
views.py
def history(request):
url_name = request.resolver_match.url_name
incomeT = IncomeTransaction.objects.all()
expenseT = ExpenseTransaction.objects.all()
innerT = InnerTransaction.objects.all()
transactions = sorted((chain(incomeT, expenseT, innerT)), key=attrgetter('date'), reverse=True)
filter_value = "all"
if request.method == 'POST':
if request.POST.get('history_filter'):
filter_value=request.POST.get('history_filter')
if filter_value == "all":
return render(request, 'core/history.html', {'url_name': url_name, 'transactions':transactions, 'filter_value': filter_value})
if int(filter_value) in range(1,13):
incomeT = IncomeTransaction.objects.filter(date__month=int(filter_value))
expenseT = ExpenseTransaction.objects.filter(date__month=int(filter_value))
innerT = InnerTransaction.objects.filter(date__month=int(filter_value))
transactions = sorted((chain(incomeT, expenseT, innerT)), key=attrgetter('date'), reverse=True)
return render(request, 'core/history.html', {'url_name': url_name, 'transactions':transactions, 'filter_value': filter_value})
elif request.POST.get('IncomeTransactionId'):
transactionId=int(request.POST.get('IncomeTransactionId'))
IncomeTransaction.objects.filter(id=transactionId).delete()
return render(request, 'core/history.html', {'url_name': url_name, 'transactions': transactions, 'filter_value': filter_value})
return render(request, 'core/history.html', {'url_name': url_name, 'transactions': transactions, 'filter_value': filter_value})
history.html
{% extends 'core/base.html' %}
{% load core_custom_tags %}
{% block title %}История{% endblock %}
{% block content %}
<h1 class="text-center history-header">История</h1>
<div class="row">
<div class="col">
<form method="POST" action="{% url 'core:history' %}">
{% csrf_token %}
<select name="history_filter">
<option value="all" {% if filter_value == "all" %}selected{% endif %}>Всё время</option>
<option value="1" {% if filter_value == "1" %}selected{% endif %}>Январь</option>
<option value="2" {% if filter_value == "2" %}selected{% endif %}>Февраль</option>
<option value="3" {% if filter_value == "3" %}selected{% endif %}>Март</option>
<option value="4" {% if filter_value == "4" %}selected{% endif %}>Апрель</option>
<option value="5" {% if filter_value == "5" %}selected{% endif %}>Май</option>
<option value="6" {% if filter_value == "6" %}selected{% endif %}>Июнь</option>
<option value="7" {% if filter_value == "7" %}selected{% endif %}>Июль</option>
<option value="8" {% if filter_value == "8" %}selected{% endif %}>Август</option>
<option value="9" {% if filter_value == "9" %}selected{% endif %}>Сентябрь</option>
<option value="10" {% if filter_value == "10" %}selected{% endif %}>Октябрь</option>
<option value="11" {% if filter_value == "11" %}selected{% endif %}>Ноябрь</option>
<option value="12" {% if filter_value == "12" %}selected{% endif %}>Декабрь</option>
</select>
<input type="submit" class="btn btn-primary" value="Отправить">
</form>
</div>
</div>
{% if transactions %}
{% for el in transactions %}
{% if el.income_category.name %}
<div class="row justify-content-center row-transaction-history">
<div class="col-5">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm">{{ el.account.name }}</div>
<div class="col-sm history-date">{{ el.date }}</div>
</div>
</div>
<div class="card-body">
<div class="row justify-content-around">
<div class="col">
<fieldset class="reset-this redo-fieldset">
<legend class="reset-this redo-legend"> Сумма </legend>
<h5 class="card-title text-center">+{{ el.amount|division:100 }} руб.</h5>
</fieldset>
</div>
<div class="col">
<fieldset class="reset-this redo-fieldset">
<legend class="reset-this redo-legend"> Категория </legend>
<h5 class="card-title text-center">{{ el.income_category.name }}</h5>
</fieldset>
</div>
</div>
{% if el.commentary %}
<div class="row">
<div class="col">
<fieldset class="reset-this redo-fieldset history-commentary">
<legend class="reset-this redo-legend"> Комментарий </legend>
<p class="card-text text-center">{{ el.commentary }}</p>
</fieldset>
</div>
</div>
{% endif %}
<div class="row">
<div class="col">
<form method="POST" action="{% url 'core:history' %}">
{% csrf_token %}
<button type="submit" name="IncomeTransactionId" value="{{el.id}}">Удалить</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{% endif %}
{% if el.expense_category.name %}
<div class="row justify-content-center row-transaction-history">
<div class="col-5">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm">{{ el.account.name }}</div>
<div class="col-sm history-date">{{ el.date }}</div>
</div>
</div>
<div class="card-body">
<div class="row justify-content-around">
<div class="col">
<fieldset class="reset-this redo-fieldset">
<legend class="reset-this redo-legend"> Сумма </legend>
<h5 class="card-title text-center">-{{ el.amount|division:100 }} руб.</h5>
</fieldset>
</div>
<div class="col">
<fieldset class="reset-this redo-fieldset">
<legend class="reset-this redo-legend"> Категория </legend>
<h5 class="card-title text-center">{{ el.expense_category.name }}</h5>
</fieldset>
</div>
</div>
{% if el.commentary %}
<div class="row">
<div class="col">
<fieldset class="reset-this redo-fieldset history-commentary">
<legend class="reset-this redo-legend"> Комментарий </legend>
<p class="card-text text-center">{{ el.commentary }}</p>
</fieldset>
</div>
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endif %}
{% if el.account_to.name %}
<div class="row justify-content-center row-transaction-history">
<div class="col-5">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm">{{ el.account_from.name }} -> {{ el.account_to.name }}</div>
<div class="col-sm history-date">{{ el.date }}</div>
</div>
</div>
<div class="card-body">
<div class="row justify-content-around">
<div class="col">
<fieldset class="reset-this redo-fieldset inner-amount">
<legend class="reset-this redo-legend"> Сумма </legend>
<h5 class="card-title text-center">{{ el.amount|division:100 }} руб.</h5>
</fieldset>
</div>
<div class="col">
<fieldset class="reset-this redo-fieldset">
<legend class="reset-this redo-legend"> Категория </legend>
<h5 class="card-title text-center">Перевод между своими счетами</h5>
</fieldset>
</div>
</div>
{% if el.commentary %}
<div class="row">
<div class="col">
<fieldset class="reset-this redo-fieldset history-commentary">
<legend class="reset-this redo-legend"> Комментарий </legend>
<p class="card-text text-center">{{ el.commentary }}</p>
</fieldset>
</div>
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endif %}
{% endfor %}
{% else %}
<p class="text-center">Транзакций нет</p>
{% endif %}
{% endblock %}
Ответы (1 шт):
Вероятно у Вас такое происходит потому, что сначала Вы заполняете
transactions = sorted((chain(incomeT, expenseT, innerT)), key=attrgetter('date'), reverse=True)
т.е. туда заносятся уже все данные которые есть в БД на момент начала view
а удаляете данные в конце
IncomeTransaction.objects.filter(id=transactionId).delete()
после этого в контекст отдаете данные которые были до удаления.