Учимся загружать файл через стандартное API Django REST Framework.
Загруженный файл приходит в request.FILES, класс UploadedFile. Для HTML-формы должно быть установлено enctype=“multipart/form-data” и она должна заливаться через POST. Идут годы, а формы в HTML не меняются…
В Django Model есть специальный поля для хранения загруженных файлов — FileField и ImageField. Они хранят, разумеется, не в базе, а на жёстком диске.
Куда класть закаченный файлы — прописывается в settings.py:
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
И можно разрешить смотреть их прямо по URL, если у нас DEBUG:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # Project url patterns... ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Можно специально указать поддиректорию, в которую будут скидываться файлы, указанные для FileField:
from django.db import models class Document(models.Model): description = models.CharField(max_length=255, blank=True) document = models.FileField(upload_to='documents/%Y/%m/%d/') uploaded_at = models.DateTimeField(auto_now_add=True)
Загруженные в Document.document файлы будут лежать в папке media/documents/2018/05/04.
Удобней всего загружать через формы.
Создаём форму:
from django import forms from uploads.core.models import Document class DocumentForm(forms.ModelForm): class Meta: model = Document fields = ('description', 'document', )
Создаём view:
def model_form_upload(request): if request.method == 'POST': form = DocumentForm(request.POST, request.FILES) if form.is_valid(): form.save() return redirect('home') else: form = DocumentForm() return render(request, 'core/model_form_upload.html', { 'form': form })