Как избежать вставки новой строки тех же данных в базу данных Mysql при нажатии кнопки next или save формы в Django

В моем проекте есть 4 формы, в которых внизу есть кнопки "Назад", "Далее" и "Сохранить". Каждый раз, когда я нажимаю кнопку next или save, в базу данных добавляется новая строка с теми же данными. Как я могу избежать этого и редактировать/обновлять ту же самую строку, когда я изменил данные в форме.
admission - 1-я форма
personalinfo - 2-я форма
академическая - 3-я форма
достижения - 4-я форма

Вот мой views.py
Я вставляю код только для первой формы, так как остальные формы одинаковы

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth import logout
from django.contrib.auth.models import User
from django.conf import settings
from django.shortcuts import redirect
from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from usersite.forms import admissionForm,personalinfoForm,academicForm
from usersite.models import admission as admission2
from usersite.models import personalinfo as personalinfo2
from usersite.models import academic as academic2
from django.contrib.auth.models import User


@login_required
def admission(request):

  if  request.user.is_authenticated:

      user = request.user
      print(user)
      form = admissionForm()
      #admission1 = admission2.objects.get(user=2)
      try:
        admission1 = admission2.objects.filter(user=user).latest('pk')
      except:
        admission1 = admission2.objects.filter(user=user)
      #admission1 = admission2.objects.all()

      return render(request,'admission.html', context={'form': form , 'admission1': admission1})
      #return render(request,'admission.html', context={'form': form)

  else:

    return redirect('unauthorised')

@login_required
def submit_admission(request):

    if request.user.is_authenticated:

      user = request.user
      print(user)
      
      form = admissionForm(request.POST)
      if form.is_valid():
        print("changed")
        #print(form.cleaned_data)
        admission = form.save(commit=False)
        admission.user = user
        admission.save()


        return redirect("personalinfo")
      else:
        return render(request,'admission.html',context = {'form': form})

admission.html

models.py

from django.db import models
from django.contrib.auth.models import User
from phonenumber_field.modelfields import PhoneNumberField
from datetime import datetime


class admission(models.Model):
    procname = models.CharField(max_length=45, blank=True, null=True)
    surname = models.CharField(max_length=45, blank=True, null=True)
    name = models.CharField(max_length=45, blank=True, null=True)
    midname = models.CharField(max_length=45, blank=True, null=True)
    student_image = models.ImageField(upload_to='users/%Y/%m/%d/', blank=True)

    rollsem1 = models.CharField(max_length=3, blank=True, null=True) 
    rollsem2 = models.CharField(max_length=3, blank=True, null=True)
    rollsem3 = models.CharField(max_length=3, blank=True, null=True)
    rollsem4 = models.CharField(max_length=3, blank=True, null=True)
    rollsem5 = models.CharField(max_length=3, blank=True, null=True)
    rollsem6 = models.CharField(max_length=3, blank=True, null=True)
    rollsem7 = models.CharField(max_length=3, blank=True, null=True)
    rollsem8 = models.CharField(max_length=3, blank=True, null=True)
    
    year = models.CharField(max_length=45, blank=True, null=True)
    category = models.CharField(max_length=45, blank=True, null=True)
    hsc = models.CharField(max_length=45, blank=True, null=True)
    cet = models.CharField(max_length=45, blank=True, null=True)
    jee = models.CharField(max_length=45, blank=True, null=True)
    diploma = models.CharField(max_length=45, blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

urls.py

from django.urls import path
from.import views
from django.contrib.auth import views as auth_views


urlpatterns = [
    path('admission', views.admission, name='admission'),
    path('submit_admission/', views.submit_admission, name='submit_admission'),
    path('academic', views.academic, name='academic'),

    path('achievementdetails', views.achievementdetails, name='achievementdetails'),
    path('personalinfo', views.personalinfo, name='personalinfo'),
    path('unauth', views.unauthorised, name='unauth'),
    path('logout', views.logout_view, name='logout'),
    path('logreg/login/', auth_views.LoginView.as_view()),
    path('submit_personalinfo/', views.submit_personalinfo, name='submit_personalinfo'),
    path('submit_academic/', views.submit_academic, name='submit_academic'),
    

]

вы хотите создать "форму мастера с шагами". До версии 1.8 это было частью Django, сейчас это отдельный проект. подробнее здесь: https://docs.djangoproject.com/en/1.8/releases/1.8/#removal-of-django-contrib-formtools. form-tools здесь: https://github.com/jazzband/django-formtools

Кратко: вы можете сохранять данные шага без необходимости сохранять экземпляр на каждом шаге. на последнем шаге вы можете сохранить все данные один раз.

другая возможность - на каждом следующем шаге необходимо устанавливать admission.pk из сохраненного экземпляра с предыдущего шага

Вернуться на верх