Here's an example of the Django docs itself, which you can modify like this and handle the situation with a single form:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from .models import ModelWithFileField
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
if form.file:
instance = ModelWithFileField(file_field=request.FILES['file'])#or form.file
instance.save()
return HttpResponseRedirect('/success/url/')
elif form.selected:
instance = ModelWithFileField(file_field=selected_file(form.selected)) #define a function to fetch the selected file by id or name or whatever you use in your template
instance.save()
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form}) #nothing chosen or uploaded
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
and your form will look something like this:
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField(required=False)
selected = forms.IntegerField(required=False)
and If needed you could also customize your form validators.
Also if you're willing to, you could switch to DRF and use Serializers instead of Forms which I personally find a bit easier.