How can i update data to a related field before saving Django model form

Viewed 357

I am trying to update the user instance of an assigned file when the file is transferred. The transfer POST action goes through successfully without any errors but then the user instance of the file model is not updated with "transfer_to" user instance. This is what I have done so far:

models.py

class File(models.Model):
    file_type_choice = (
        ('General', 'General'),
        ('Personal', 'Personal')
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='files')
    file_type = models.CharField(max_length=250, choices=file_type_choice)
    file_name = models.CharField(max_length=250)
    recipient_name = models.CharField(max_length=250)

    def __str__(self):
        return f'{self.file_name}'

    def get_absolute_url_file_transfer(self):
        return reverse('file_transfer', args=[self.pk])


class Transfer(models.Model):
    file = models.ForeignKey('File', on_delete=models.CASCADE, null=True)
    transfer_from = models.ForeignKey(User, on_delete=models.CASCADE, related_name='transfers_from', null=True)
    transfer_to = models.ForeignKey(User, on_delete=models.CASCADE, related_name='transfers_to', null=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.transfer_from} {self.transfer_to}'

forms.py

class FileTransferForm(forms.ModelForm):
    class Meta:
        model = Transfer
        fields = ['transfer_from', 'transfer_to', ]

views.py

@login_required
def outgoing_file_list(request):
    if request.user.is_superuser:
        files = File.objects.all()
    else:
        files = File.objects.filter(Q(transfer__transfer_to=request.user) | Q(user=request.user))

    context = {
        'files': files,
    }

    return render(request, 'outgoing_file_list.html', context)


def file_transfer(request, pk):
    file = get_object_or_404(File, pk=pk)

    if request.method == "POST":
        form = FileTransferForm(data=request.POST)
        if form.is_valid():
            form_edit = form.save(commit=False)
            form_edit.file = file
            file.user = form_edit.transfer_to
            file.save()
            form_edit.save()
            return redirect('outgoing_file_list')
    else:
        form = FileTransferForm()

    context = {
        'form': form,
        'file': file,
    }

    return render(request, 'file_transfer.html', context)

form_edit.tranfer_to does not return user instance

0 Answers
Related