На большинстве веб-сайтов мы часто имеем дело с мультимедийными данными, такими как изображения, файлы и т. Д. c. В django мы можем работать с изображениями с помощью поля модели, которое называется ImageField.
В этой статье мы создали приложение image_app в примере проекта с именем image_upload.
Самый первый шаг - добавить приведенный ниже код в файл settings.py.
filter_none
brightness_4
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
MEDIA_ ROOT - путь к серверу для хранения файлов на компьютере. MEDIA_URL является ссылочным URL для браузера, чтобы получить доступ к файлам через Http.
В urls.py мы должны отредактировать конфигурацию следующим образом:
if settings.DEBUG:
urlpatterns + = stati c (settings.MEDIA_URL, document_root = settings.MEDIA_ ROOT)
Пример файла models.py должен быть таким, поскольку мы создали модель отеля, которая состоит из названия отеля и его изображение. В этом проекте мы берем имя отеля и его изображение от пользователя для сайта бронирования отелей.
filter_none
brightness_4
# models.py
class Hotel(models.Model):
name = models.CharField(max_length=50)
hotel_Main_Img = models.ImageField(upload_to='images/')
//Here upload_to will specify, to which directory the images should reside, by default django creates the directory under media directory which will be automatically created when we upload an image. No need of explicit creation of media directory.
Мы должны создать файл forms.py в image_app, здесь мы имеем дело с формой модели, чтобы сделать содержимое легче понять.
filter_none
brightness_4
# forms.py
from django import forms
from .models import *
class HotelForm(forms.ModelForm):
class Meta:
model = Hotel
fields = ['name', 'hotel_Main_Img']
Django будет неявно обрабатывать проверку формы без явного объявления в скрипте, и будет создавать аналогичные поля формы на странице в соответствии с полями модели, которые мы указали в файл models.py. Это преимущество формы модели.
Теперь создайте каталог шаблонов под image_app, в котором мы должны создать файл html для загрузки изображений. Файл HTML должен выглядеть следующим образом.
filter_none
edit
play_arrow
brightness_4
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hotel_image</title>
</head>
<body>
<form method = "post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
</body>
</html>
При выполнении запроса POST мы должны каким-то образом кодировать данные, которые формируют тело запроса. Итак, мы должны указать формат кодировки в теге формы. multipart / form-data значительно сложнее, но позволяет включать в данные целые файлы.
csrf_token предназначен для защиты от подделок межсайтовых запросов.
form.as_p просто переносит все элементы в HTML тегах абзаца. Преимущество заключается в том, что в шаблоне не нужно писать al oop для явного добавления HTML для окружения каждого заголовка и поля.
В файле views.py под image_app мы должны написать представление для взятия запрашивает у пользователя и возвращает некоторую страницу html.
filter_none
brightness_4
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .forms import *
# Create your views here.
def hotel_image_view(request):
if request.method == 'POST':
form = HotelForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('success')
else:
form = HotelForm()
return render(request, 'hotel_image_form.html', {'form' : form})
def success(request):
return HttpResponse('successfully uploaded')
всякий раз, когда срабатывает hotel_image_view и этот запрос POST, мы создаем экземпляр формы модели form = HotelForm (request.POST, request.FILES ) изображение будет сохранено по запросу. ФАЙЛЫ. Если это действительно так, сохраните в базу данных и перенаправьте на URL-адрес успеха, который указывает на успешную загрузку изображения. Если метод не POST, мы выполняем рендеринг с созданным шаблоном html.
urls.py будет выглядеть так -
filter_none
brightness_4
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from .views import *
urlpatterns = [
path('image_upload', hotel_image_view, name = 'image_upload'),
path('success', success, name = 'success'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT) `enter code here`