Form.save() не работает в django при использовании FileField() в моделях. Загруженный файл не сохраняется в каталоге
Я довольно новичок в Django и пытаюсь сохранить загруженное пользователем изображение в папку. После небольшого исследования я узнал, что form.save() сохраняет форму и изображение в мою папку. Но это не работает.
Вы можете увидеть коды GridFS, это потому, что я также пытаюсь сохранить загруженный файл в базу данных MongoDB через GridFS. Я привел коды и ошибки ниже.
У меня есть эти строки кода в моем views.py файле
def upload_file(request):
if request.method == 'POST':
form = UploadFile(request.POST, request.FILES)
file = request.FILES['file']
extension = str(file).split('.')[1]
img_extension = ['jpeg', 'jpg', 'png', 'tiff', 'raw', 'gif']
video_extension = ['mp4', 'mov', 'wmv', 'avi', 'mkv', 'webm']
if extension in img_extension:
if form.is_valid():
form.save()
return HttpResponse('Success')
return HttpResponse('It is a Image Extension - ' + str(extension))
elif extension in video_extension:
if form.is_valid():
form.save()
return HttpResponse('Success')
return HttpResponse('It is a Video Extension - ' + str(extension))
else:
return HttpResponse('Please Upload a proper Image or a Video format')
else:
form = UploadFile()
context = {
'form': form,
}
return render(request, 'upload.html', context)
У меня есть простой FileField() в models.py файле
from django.db import models
from django.conf import settings
from djongo.storage import GridFSStorage
from django.core.files.storage import FileSystemStorage
from project.settings import MEDIA_URL
grid_fs_storage = GridFSStorage(collection='images', base_url=''.join([settings.MEDIA_ROOT, 'images/']))
fs = FileSystemStorage(location='/images')
# Create your models here.
class Uploads(models.Model):
uploaded_file = models.FileField(null=True, blank=True, upload_to="images/", storage=fs)
Ошибка, которую я получаю, гласит
AttributeError at /upload/
'UploadFile' object has no attribute 'save'
urls.py файл
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from base.views import upload_file, home, FileFieldFormView
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('upload/', upload_file, name='upload'),
path('new-upload/', FileFieldFormView.as_view(), name='new-upload'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Файл шаблонов upload.html
{% extends "base.html" %}
{% block content %}
<form action="{% url 'upload' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<!-- <input type="submit" value="upload" name="" id=""> -->
<button type="submit">Upload</button>
</form>
{% endblock content %}
Что я здесь упускаю?
Мое предложение - использовать модель формы ModelForm, поскольку это значительно упростит процесс. Просто преобразуйте вашу форму в ModelForm:
from django.forms import ModelForm
# Assuming your model is in the same app as your form, then
from .models import Uploads
class UploadFile(forms.Form):
class Meta:
model = Uploads
Тогда вы можете оставить свой вид как есть, а form.save() позаботится о сохранении файла за вас.
Если вам нужно остаться с обычными формами вместо ModelForm, вы можете использовать FieldFile.save().