Не работает загрузка файлов в Django: Файлы не отображаются в каталоге медиафайлов или базе данных
Я разрабатываю Django-приложение, в котором пользователи могут загружать файлы, связанные с определенными темами и представлениями. Несмотря на то, что все настроено в соответствии с документацией Django, после загрузки файлы не появляются ни в указанном медиа-каталоге, ни в базе данных. Я использую Django 5.0.4 и Python 3.10.
Models.py:
class File(models.Model):
topic = models.ForeignKey(Topic, related_name='files', on_delete=models.CASCADE, null=True)
submission = models.ForeignKey(Submission, related_name='files', on_delete=models.CASCADE, null=True)
filename = models.FileField(upload_to='submissions/', null=True)
upload_date = models.DateTimeField(auto_now_add=True)
is_accepted = models.BooleanField(default=False)
def __str__(self):
return f"File: {self.filename.name} for Topic: {self.topic.name}"
Forms.py:
class UploadFileForm(ModelForm):
class Meta:
model = File
fields = ('filename',)
Views.py:
def upload_file(request, subm_id, topic_id):
submission = get_object_or_404(Submission, pk=subm_id)
topic = get_object_or_404(Topic, pk=topic_id)
form = UploadFileForm()
context = {'submission':submission, 'topic':topic, 'form': form}
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
file_instance = form.save(commit=False)
file_instance.topic = topic
file_instance.submission = submission
file_instance.save()
messages.success(request, 'File succesfully uploaded')
return redirect('upload_file', subm_id=submission.id, topic_id=topic.id)
else:
print(request.FILES)
messages.error(request, 'No file was uploaded')
form = UploadFileForm()
return render(request, 'users/upload_file.html', context=context)
Settings.py:
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
Шаблон:
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
<div class="mb-3">
<label class="form-label" for="{{ form.filename.id_for_label}} "
>Загрузите файл</label
>
{{ form|crispy }}
</div>
<input class="btn btn-secondary" type="submit" value="Submit" />
</form>
Что может быть причиной этой проблемы и как я могу ее решить, чтобы обеспечить правильную загрузку и сохранение файлов в Django?
Вот список возможных случаев:
Отсутствует url медиафайла
if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Если вы отправляете файлы, форма должна иметь enctype="multipart/form-data" info about enctype
Попробуйте распечатать несколько строк в вашем представлении (это полезно во многих случаях), просто чтобы увидеть, работает ли оно нормально или где оно ломается.
def upload_file(request, subm_id, topic_id): submission = get_object_or_404(Submission, pk=subm_id) topic = get_object_or_404(Topic, pk=topic_id) form = UploadFileForm() context = {'submission': submission, 'topic': topic, 'form': form}
if request.method == 'POST': print("POST request received.") print("Files in request:", request.FILES) form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): print("Form is valid.") file_instance = form.save(commit=False) file_instance.topic = topic file_instance.submission = submission file_instance.save() print(f"File instance created and saved: {file_instance}") messages.success(request, 'File successfully uploaded') return redirect('upload_file', subm_id=submission.id, topic_id=topic.id) else: print("Form is not valid. Errors:", form.errors) messages.error(request, 'No file was uploaded or form was invalid.') form = UploadFileForm() print("Rendering the upload file page.") return render(request, 'users/upload_file.html', context=context)