Загрузить файл в Django

Загрузить файл в Django

Vaibhav Vaibhav Jan-22, 2022 Jun-29, 2021 Django
  1. Установите среду Django
  2. Настроить проект Django
  3. Протестируйте сервер
  4. Обновите файл settings.py
  5. Создать модель
  6. Создайте форму для загрузки файлов
  7. Добавить просмотры
  8. Настройте файл urls.py
  9. Тестирование

В этой статье вы узнаете, как загружать файлы в Django. Мы создадим простое приложение с простой формой для заполнения деталей и выбора файла. Кроме того, отобразите все загруженные файлы в таблице внизу.

Прежде чем мы продолжим, рекомендуется создать новую папку или каталог для этого проекта, чтобы все было организовано.

Установите среду Django

В этом руководстве мы будем использовать виртуальную среду. Использование виртуальной среды не обязательно, но рекомендуется иметь уникальную виртуальную среду для каждого проекта.

Для создания виртуальной среды нам понадобится пакет Python virtualenv. Если у вас его нет на вашем компьютере, вы можете загрузить его с помощью следующей команды.

pip install virtualenv

Теперь, когда вы установили пакет, давайте создадим среду.

Чтобы создать среду, выполните следующую команду.

virtualenv environment

environment - это имя только что созданной виртуальной среды. В этой среде версия Python будет установлена ​​на вашем компьютере глобально и не будет никаких пакетов, кроме пакетов по умолчанию.

Чтобы активировать эту среду и использовать ее, выполните следующую команду.

environment\Scripts\activate

Теперь, когда мы изучаем Django, нам нужна установленная библиотека Django. Кроме того, поскольку мы учимся загружать файлы, нам нужен дополнительный пакет Python для работы с изображениями. Название пакета Pillow. Установим все зависимости.

pip install django
pip install Pillow

Или же,

pip3 install django
pip3 install Pillow

Обратите внимание, что на момент написания этой статьи последняя версия Django - 3.2.

Настроить проект Django

Чтобы настроить проект Django, мы сначала должны создать проект Django, создать приложение, зарегистрировать это приложение и выполнить первоначальные миграции.

Чтобы создать проект Django, выполните следующую команду.

django-admin startproject DjangoFileUpload

Теперь измените рабочий каталог на этот проект, используя следующую команду.

cd DjangoFileUpload

Чтобы создать приложение внутри проекта Django, выполните следующую команду.

django-admin startapp Core

Или же,

python manage.py startapp Core

Core - это имя приложения.

Чтобы зарегистрировать это приложение, введите имя приложения в списке INSTALLED_APPS в файле settings.py.

  • settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "Core" # Here
]

Для правильной работы Django требуется несколько моделей. Например, система аутентификации или суперпользователь не будут работать без первоначальной миграции. Итак, чтобы выполнить первоначальные миграции, выполните следующую команду.

python manage.py migrate

Выход:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

Протестируйте сервер

Чтобы запустить сервер, используйте следующую команду. Если все прошло без ошибок, вы должны увидеть, что ваш сервер Django работает по адресу http://127.0.0.1:8000/.

python manage.py runserver

Обновите файл settings.py

Загруженные файлы нужно где-то хранить. В Django по умолчанию все загруженные файлы хранятся в папке media. Вы всегда можете изменить имя папки и связанный с ней URL-адрес, но мы будем придерживаться соглашения об именах по умолчанию.

Чтобы определить URL-адрес медиа-файлов MEDIA_URL и путь к медиа-папке MEDIA_ROOT, добавьте следующие операторы в файл settings.py.

  • settings.py
import os 

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Не забудьте импортировать модуль os. В противном случае Python выдаст ошибку.

Создать модель

Чтобы сохранить загруженные файлы, нам нужно создать модель. Поле в этой модели будет содержать путь к загруженному файлу, но не сам файл.

Создадим модель Document для хранения информации о загруженных файлах.

  • Core\models.py
from django.db import models

class Document(models.Model):
    title = models.CharField(max_length = 200)
    uploadedFile = models.FileField(upload_to = "Uploaded Files/")
    dateTimeOfUpload = models.DateTimeField(auto_now = True)

Модель имеет поле title символьного типа для хранения пользовательского заголовка для загруженного файла, а dateTimeOfUpload будет хранить дату и время загрузки файла. Поле даты и времени будет автоматически установлено при создании объекта модели.

Для хранения файлов мы используем FileField(). Этот тип охватывает все типы файлов. Но если вы хотите быть немного конкретным с изображениями, вы можете использовать ImageField() для хранения изображений. Для всех остальных полей вы должны придерживаться FileField().

Параметр upload_to используется для определения папки, в которую файлы данной модели будут загружены в папку media.

Прежде чем использовать эту модель, мы должны выполнить миграции и перенести их. Для этого выполните две следующие команды.

python manage.py makemigrations
python manage.py migrate

Создайте форму для загрузки файлов

Внутри приложения или папки Core создайте новую папку, а именно templates. Внутри этой папки создайте еще одну папку, а именно Core. Это должно быть имя вашего приложения. Наконец, создайте в этой папке новый файл, а именно upload-file.html.

Теперь у вас должна быть такая файловая структура.

DjangoFileUpload /
    DjangoFileUpload /
        __init__.py
        asgi.py
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    manage.py
    Основной/
        миграции /
        шаблоны /
            Основной/
                upload-file.html
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        views.py

Внутри upload-file.html добавьте следующий HTML-код.

  • Core\templates\Core\upload-file.html
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Django File Upload</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');

        * {
            font-family: "Roboto";
        }

        body {
            background-color: #F5F5F5;
        }

        form {
            background-color: #FFFFFF;
            padding: 25px;
        }

        table {
            width: 100%; 
            text-align: center;
            margin-top: 25px;
            padding: 25px;
            background-color: #FFFFFF;
        }

        table tr td {
            padding-top: 15px;            
        }
    </style>
</head>
<body>
    <form action="{% url 'Core:uploadFile' %}" method="POST" enctype="multipart/form-data">
        <input type="text" name="fileTitle" placeholder="Enter a title">
        <input type="file" name="uploadedFile">
        {% csrf_token %}
        <input type="submit" value="Upload">
    </form>
    <table>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>File Path</th>
            <th>Upload Date & Time</th>
        </tr>
        {% for file in files %}
            <tr>
                <td>{{ file.id }}</td>
                <td>{{ file.title }}</td>
                <td>{{ file.uploadedFile.url }}</td>
                <td>{{ file.dateTimeOfUpload }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

Внутри таблицы мы отобразим некоторые сведения о загруженных файлах.

Добавить просмотры

Чтобы отобразить HTML-шаблон и информацию о нем, а также сохранить и обработать загрузку файлов, мы создадим представление uploadFile().

См. Следующий код

  • Core\views.py
from . import models
from django.shortcuts import render

def uploadFile(request):
    if request.method == "POST":
        # Fetching the form data
        fileTitle = request.POST["fileTitle"]
        uploadedFile = request.FILES["uploadedFile"]

        # Saving the information in the database
        document = models.Document(
            title = fileTitle,
            uploadedFile = uploadedFile
        )
        document.save()

    documents = models.Document.objects.all()

    return render(request, "Core/upload-file.html", context = {
        "files": documents
    })

Это представление отображает HTML-шаблон, который мы только что создали в предыдущем разделе. Форма в шаблоне HTML отправляется по тому же URL-адресу и обрабатывается в этом представлении. Если метод запроса - POST, мы получаем информацию, введенную в форму, и загруженный файл, сохраняем эту информацию в модели и сохраняем модель.

В противном случае, в общем случае, мы извлекаем все загруженные файлы и отправляем их в контекстном словаре для отображения в шаблоне HTML.

Настройте файл urls.py

Наконец, давайте настроим URL-адреса. Прежде чем продолжить, создайте новый файл, а именно urls.py внутри приложения или папки Core. Этот файл будет содержать все URL-адреса, связанные с этим приложением Django. Рекомендуется иметь отдельный файл urls.py для каждого приложения Django.

Внутри этого файла добавьте следующий код.

from . import views
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

app_name = "Core"

urlpatterns = [
    path("", views.uploadFile, name = "uploadFile"),
]

if settings.DEBUG: 
    urlpatterns += static(
        settings.MEDIA_URL, 
        document_root = settings.MEDIA_ROOT
    )

Мы добавили шаблон URL для HTML-шаблона upload-file.html. Также мы добавили еще один URL-адрес для медиафайлов. Мы будем использовать постоянные переменные, которые мы объявили в файле settings.py.

Поскольку мы создали новый файл urls.py внутри приложения Core, мы должны связать определенные здесь URL-адреса с основным проектом.

Для этого добавьте следующий оператор в список urlpatterns в DjangoFileUpload\urls.py

path("", include("Core.urls")),

Ваш файл должен выглядеть примерно так.

Файл: DjangoFileUpload\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path("", include("Core.urls")),
]

Тестирование

Поздравляю! Пришло время протестировать проект. Следуйте инструкциям ниже.

  • Запустите сервер с помощью команды - python manage.py runserver
  • Перейти по URL http://127.0.0.1:8000/
  • Заполните форму заголовком, выберите файл и отправьте форму.

Теперь вы должны увидеть некоторые сведения о файле в таблице под формой.

Более того, если вы проверите свой рабочий каталог, вы увидите, что была создана папка с именем media, а внутри этой папки есть еще одна папка с именем Uploaded Files. В этой папке находятся все загруженные файлы.

Вы можете загружать фотографии, видео, программы, PDF-файлы, файлы JSON, HTML-файлы и т. Д. Обратите внимание, что время загрузки зависит от размера файла, поэтому проявите терпение при загрузке.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub