Django - проблема с сохранением данных в Createview с ModelForm в базу данных не по умолчанию
У меня возникла проблема с сохранением данных в базу данных не по умолчанию.
В models.py у меня есть:
grid_fs_storage = GridFSStorage(collection='tab_userinquiries', base_url='mydomain.com/userinquiries/',database='mongo_instance')
class DocsUserInquiry(models.Model):
query_pk = models.CharField(blank=False, null=False, unique=True, max_length=150, primary_key=True) # auto - calculated
query_file_md5 = models.CharField(blank=False, null=True, unique=False, max_length=200) # auto - calculated
query_file = models.FileField(upload_to='userinquiries',storage=grid_fs_storage,null=True) # auto from form
В views.py:
class UploadInquiryFileView(CreateView,LoginRequiredMixin):
model=DocsUserInquiry
template_name ='new_inquiry.html'
success_message = "You've added your new Token successfully"
form_class = UploadInquiryFileForm
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request.FILES)
if form.is_valid():
file_name = request.FILES['query_file'].name
print(f'file...{file_name}')
q_pk = random_id()
file_in = self.request.FILES.get('query_file')
f_md5 = calculate_md5(file_in)
form.instance.query_pk = q_pk
form.instance.query_file_md5 = f_md5
form.save()
return HttpResponse(self.success_message)
Проблема в том, что каждый раз при отправке формы я получаю
Exception Type: TypeError
Exception Value: database must be an instance of Database
Я попробовал добавить это к методу post:
instance = form.save(commit=False)
instance.save(using='mongo_instance')
но ошибка та же самая.
Есть идеи, как решить эту проблему?
ПРИМЕЧАНИЕ: Эта проблема связана только с modelform или когда я использую пользовательский список полей в представлении. Когда я использую CreateView без ModelForm, но с fields = 'all' и дополнительно с логикой, передаваемой в метод form_valid представления вместо post, все работает нормально. Затем файлы добавляются в мою mongo db.
После некоторых тестов я понял, что проблема в gridfs. После внесения небольших изменений в FileField я получил ожидаемый результат.
Мне пришлось удалить upload_to и storage из этого поля в models.py. Это сохраняет данные из моей формы в mongo, но без самого файла. Для этого мне пришлось добавить в post метод моего CreateView подключение к mongo через MongoClient и сохранить файл таким отдельным способом.
Совершенно не понимаю, в чем проблема с gridfs хранилищем, указываемым непосредственно в FileField модели.