Загрузка файла в Django REST Framework

Учимся загружать файл через стандартное API Djan­go REST Frame­work.

Загруженный файл приходит в request.FILES, класс Upload­ed­File. Для HTML-формы должно быть установлено enctype=“multipart/form-data” и она должна заливаться через POST. Идут годы, а формы в HTML не меняются…

В Djan­go Mod­el есть специальный поля для хранения загруженных файлов — File­Field и Image­Field. Они хранят, разумеется, не в базе, а на жёстком диске.

Куда класть закаченный файлы — прописывается в 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)

Можно специально указать поддиректорию, в которую будут скидываться файлы, указанные для File­Field:

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
    })

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *