Django создает новую запись вместо обновления существующей записи

Я новичок в Python и Django, пытаюсь создать приложение, которое может создавать и обновлять членов (пользовательская таблица в базе данных SQL). Создание работает нормально, но при обновлении вместо обновления существующего члена создается новая запись при каждом отправлении. Извините, потому что stackoverflow не позволял мне сохранить

'VIEW.py класс единого представления обрабатывает URL параметр с ?id=idofrecord и &ed=T для отображения формы редактирования'

#LISTS VIEWS
class NewMember(LoginRequiredMixin,TemplateView):

def get(self, request, \*args, \*\*kwargs):
    memberId = request.GET.get('id')
    isEdit = request.GET.get('ed')
    print('NEW MEMBER VIEW TRIGGERED')
    print(memberId)
    print(isEdit)
    if isEdit == 'T':
        memberObject = Member.objects.get(id=memberId)
        form = MemberForm(instance=memberObject)  
        print("EDIT TRIGGERED")
        return render(request, 'components/list/list-new-member.html', {'form':form, 'memberid':memberId})
     elif memberId:
        form = MemberForm()
        context = Member.objects.get(id=memberId)
        print('VEIW MEMBER TRIGERRED')
        return render(request, 'components/list/list-view-member.html', {'context':context,'form':form})
    else:
        #CREATE NEW MEMBER
        form = MemberForm()
        context = {'form':form}
        return render(request, 'components/list/list-new-member.html', context)

def post(self, request, \*args, \*\*kwargs):
    print('REST POST PRINTED')
    form = MemberForm(request.POST, request.FILES)
    if form.is_valid():
        retObj = form.save()
        print('RECORD UPDATED')
        return redirect('/app/list/member?id='+str(retObj.id))

else:
    print(request.POST)
    print(form.errors)
    print('REST PRINTING POST :form.is_valid() '+ str(form.is_valid()))
    if form.is_valid():

        retObj = form.save()
        print(retObj.id)
        return redirect('/app/list/member?id='+str(retObj.id))

context = {'form':form}
return render(request, 'components/list/list-new-member.html', context)
It should update the existing record as form object has passed with Instance and Post object

Model.py

#MEMBER MODEL
class Member(models.Model):
    TYPE = (
        (1, 'Associate'),
        (2, 'Supervisor'),
        (3, 'Region Head'),
        (4, 'Country Head')
    )

    GENDER = (
        (1, 'Female'),
        (2, 'Male'),
        (3, 'Other')
    )

    QUALIFICATION = (
        (1, 'Under Graduate'),
        (2, 'Graduate'),
        (3, 'Masters'),
        (4, 'PhD')
    )

    MEMBERSTATUS = (
        (1, 'Lead'),
        (2, 'Pending Approval'),
        (3, 'Active'),
        (4, 'Rejected'),
        (5, 'Terminated')
    )

    firstname = models.CharField(max_length = 120)
    middlename = models.CharField(max_length = 50, null=True)
    lastname = models.CharField(max_length = 100)
    registrationuniquekey = models.CharField(max_length = 30, null=True)
    
    profession = models.CharField(max_length = 100, null=True)    
    birthdate = models.DateField(auto_now=False, auto_now_add=False, null=True)
    gender = models.IntegerField(choices=GENDER, null=True)

    aadhaar = models.CharField(max_length = 12, null=True)
    aadhaarfile = models.ImageField(upload_to='memberfile/' , null=True, blank=True)
    profilephoto = models.ImageField(upload_to='memberfile/' , null=True, blank=True)

    memberid = models.CharField(max_length=30, null=True)
    memberstatus = models.IntegerField(choices=MEMBERSTATUS, null=True)
    registrationlink = models.CharField(max_length = 200, null=True)
    
    email = models.EmailField(max_length = 100)
    phone = models.CharField(max_length = 12, null=True)
    country = models.ForeignKey(Country, null=True, on_delete=models.SET_NULL)

    address = models.TextField(max_length = 999 , null=True)

    qualification = models.IntegerField(choices=QUALIFICATION, null=True)
    hobbies = models.CharField(max_length = 100, null=True)
    extraactivities = models.CharField(max_length = 200, null=True)

    lifegoals = models.TextField(max_length = 400, null=True)
    whywe = models.TextField(max_length = 400, null=True)
    notes = models.TextField(max_length = 400, null=True)

    referredby = models.CharField(max_length = 100,default=1)
    requestedby = models.ForeignKey(User, on_delete=models.CASCADE, default=2)
    type = models.IntegerField(choices=TYPE, null=True)
    
    approvedbystate = models.CharField(max_length = 100, null=True)
    approvedbypresident = models.CharField(max_length = 100, null=True)
    datecreated = models.DateTimeField(auto_now_add=True)
    iagree = models.BooleanField(null=True)

    def save(self, *args, **kwargs):
        if not self.registrationlink:
            self.registrationlink = None
        super(Member, self).save(*args, **kwargs)

    def __str__(self):
        return self.firstname

FORM.py

class MemberForm(forms.ModelForm):
    class Meta:
        model = Member
        fields = (
        'firstname', 
        'middlename', 
        'lastname', 
        'profession', 
        'gender',
        'aadhaar',
        'aadhaarfile',
        'profilephoto',
        'birthdate',
        'email',
        'phone',
        'country',
        'address',
        'qualification',
        'hobbies',
        'extraactivities',
        'lifegoals',
        'whywe',
        'referredby',
        'type',
        'approvedbystate',
        'approvedbypresident',
        'iagree',
        'requestedby')

        widgets = {
        'firstname':    forms.TextInput(attrs={'class':'form-control'}),
        'middlename':   forms.TextInput(attrs={'class':'form-control'}), 
        'lastname':     forms.TextInput(attrs={'class':'form-control'}),
        'profession':   forms.TextInput(attrs={'class':'form-control'}),
        'birthdate':    forms.DateInput(attrs={'class':'form-control', 'type':'date'}),
        'gender':       forms.Select(attrs={'class':'form-control'}),
        'aadhaar':      forms.NumberInput(attrs={'class':'form-control'}), 
        'aadhaarfile':  forms.FileInput(attrs={'class':'form-control'}), 
        'profilephoto': forms.FileInput(attrs={'class':'form-control'}), 
        'email':        forms.EmailInput(attrs={'class':'form-control'}),
        'phone':        forms.NumberInput(attrs={'class':'form-control', 'type':'tel'}),
        'country':      forms.Select(attrs={'class':'form-control'}),
        'address':      forms.Textarea(attrs={'class':'form-control'}),
        'qualification':forms.Select(attrs={'class':'form-control'}),   
        'hobbies':      forms.TextInput(attrs={'class':'form-control'}),
        'extraactivities': forms.TextInput(attrs={'class':'form-control'}),
        'lifegoals':    forms.Textarea(attrs={'class':'form-control'}),
        'whywe':        forms.Textarea(attrs={'class':'form-control'}),
        'referredby':   forms.TextInput(attrs={'class':'form-control'}),
        'type':         forms.Select(attrs={'class':'form-control'}),
        'approvedbystate':forms.TextInput(attrs={'class':'form-control'}),
        'approvedbypresident':forms.TextInput(attrs={'class':'form-control'}),
        'requestedby':  forms.Select(attrs={'class':'form-control'}),
        'iagree':forms.CheckboxInput()
        }

Если вы хотите обновить экземпляр, то вы должны передать объект экземпляра при инициализации формы. Например, так:

def post(self, request, *args, **kwargs):
    member_id = request.GET.get('id')  # preferable if you use url arguments instead of search query
    is_edit = request.GET.get('ed')
    if is_edit == 'T':
        member_object = Member.objects.get(id=member_id)
        form = MemberForm(request.POST, request.FILES, instance=member_object) 

Больше информации об обновлении формы можно найти в документации.

Для обновления существующего экземпляра модели Member следует использовать метод form.save(commit=False).

Попробуйте сделать это следующим образом:

if form.is_valid():
member = Member.objects.get(id=memberId)
member.firstname = form.cleaned_data['firstname']
member.save()


Member.objects.filter(id=memberId).update(firstname = form.cleaned_data['firstname'])
Вернуться на верх