Как предотвратить дублирование записей при обновлении для модели 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>
Вернуться на верх