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)