Как предотвратить дублирование записей при обновлении для модели django?
Я все еще изучаю Django и недавно обнаружил, что когда я обновляю свою страницу, она делает дублирующую запись, и хотел спросить, как я могу избежать этого или связать функцию с кнопкой, возможно.
Вот моя функция views.py
def basketballPickup(request):
# displays page and Pickup model
form = PickupForm(data=request.POST or None)
posts = Pickup.games.all()
if request.method == 'POST':
form_valid = form.is_valid()
if form_valid:
instance = form.save(commit=False)
instance.save()
return redirect()
content = {'form': form, 'posts': posts}
и вот мой HTML шаблон
{% extends "Basketball/Basketball_base.html" %}
{% block content %}
<form method="POST">
{% csrf_token %}
{{form.as_p}}
<button type="submit" name="Save_Pickup">Save Pickup Game</button>
</form>
<div id="pickup_table">
<table>
{% for i in posts %}
<tr>
<th><p>Position:<p>{{ i.position}}</th>
<th><p>Date:</p>{{ i.date}}</th>
<th><p>Points:</p>{{ i.points}}</th>
<th><p>Assists:</p>{{ i.assists}}</th>
<th><p>Rebounds:</p>{{ i.rebounds}}</th>
<th><p>Steals:</p>{{ i.steals}}</th>
<th><p>Blocks:</p>{{ i.blocks}}</th>
<th><p>Turnovers:</p>{{ i.turnovers}}</th>
</tr>
{% endfor %}
</table>
</div>
{% endblock %}
Вам необходимо использовать HttpResponseRedirect для предотвращения дублирования записей, как указано в документации.
Отрывок из django-doc о POST запросе.
Вы всегда должны возвращать HttpResponseRedirect после успешной работы с POST данными. Этот совет не относится к Django; это хорошая практика веб-разработки в целом.
.
Вам также необходимо обрабатывать условия GET и POST по-разному.
Итак, с вашим текущим кодом вам нужно сделать некоторые изменения:
urls.py
urlpatterns=[
...
...
path('success/',views.success,name='success')
]
views.py
from django.http import HttpResponseRedirect
def basketballPickup(request):
# displays page and Pickup model
if request.method == 'POST': # here POST condition
form = PickupForm(data=request.POST or None)
if form.is_valid():
position=form.cleaned_data['position']
date=form.cleaned_data['date']
points=form.cleaned_data['points']
assists=form.cleaned_data['assists']
rebounds=form.cleaned_data['rebounds']
steals=form.cleaned_data['steals']
blocks=form.cleaned_data['blocks']
turnovers=form.cleaned_data['turnovers']
data=Pickup(position=position,date=date,points=points,assists=assists,rebounds=rebounds,steals=steals,blocks=blocks,turnovers=turnovers)
data.save()
return HttpResponseRedirect('/success/')
else:
posts = Pickup.games.all()
form = PickupForm() # Here GET condition
content = {'form': form, 'posts': posts}
return render(request, 'Basketball/Basketball_Pickup.html', content)
def success(request):
return render(request, 'Basketball/thanks.html')
thanks.html
<body>
<h3> The form successfully submitted. </h3>
</body>