проблема с настройкой загрузки изображений на Cloudinary. Я хочу, чтобы изображения отправлялись на Cloudinary, а в базе данных сохранялась только ссылка на загруженный файл. Однако, в текущей реализации это не работает:
С Cloudinary что-то не так: Загрузка изображений не проходит. Вероятно, я неправильно настроил вызов метода cloudinary.uploader.upload или неправильно передаю файл. Кажется, проблема связана с тем, что объект изображения не обрабатывается корректно.
Ошибка в админке: Когда я пытаюсь создать объект Staff через админку, появляется сообщение: "No file was submitted. Check the encoding type on the form." Это говорит о том, что файл не передается, возможно, из-за неверной настройки формы или конфликта между типами полей в модели и форме.
models.py:
from django.db import models
POSITION = [
('Мастер П/О', 'Мастер П/О'),
('Преподователь', 'Преподователь'),
('Учебная часть', 'Учебная часть'),
('Директор', 'Директор'),
('Заместитель директора', 'Заместитель директора'),
]
class Staff(models.Model):
name = models.CharField(max_length=54, blank=False, null=False, verbose_name="Имя")
position = models.CharField(choices=POSITION, default="Преподователь", blank=False, null=False, max_length=21)
img = models.URLField(max_length=255, blank=False, null=False, verbose_name="Изображение")
phone_number = models.CharField(max_length=13, blank=False, null=False, verbose_name="Номер телефона")
email = models.EmailField(max_length=255, unique=True, verbose_name="Почта")
class Meta:
verbose_name = "Сотрудник"
verbose_name_plural = "Сотрудники"
serializers.py:
from rest_framework import serializers
from .models import Staff, POSITION
class StaffSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=24, required=True, write_only=True)
position = serializers.ChoiceField(choices=POSITION)
phone_number = serializers.CharField(max_length=13)
email = serializers.EmailField(max_length=255)
class Meta:
model = Staff
fields = "name position img phone_number email".split()
permissions.py:
from rest_framework.permissions import BasePermission
class ISStaff(BasePermission):
"""
Allows access only to admin users.
"""
def has_permission(self, request, view):
return bool(request.user and (request.user.is_staff or request.user.is_superuser))
views.py:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Staff
from .serializers import StaffSerializer
from .permissions import ISStaff
class StaffListView(APIView):
permission_classes = [ISStaff]
def get(self, request):
staff = Staff.objects.all()
serializer = StaffSerializer(staff, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class StaffDetailView(APIView):
permission_classes = [ISStaff]
def get(self, request, pk):
try:
staff = Staff.objects.get(pk=pk)
except Staff.DoesNotExist:
return Response(
{"error": "Сотрудник не найден"}, status=status.HTTP_404_NOT_FOUND
)
serializer = StaffSerializer(staff)
return Response(serializer.data, status=status.HTTP_200_OK)
forms.py:
from django import forms
import cloudinary
from .models import Staff
class StaffCustomForm(forms.ModelForm):
img = forms.ImageField(max_length=255)
phone_number = forms.CharField(max_length=13, help_text="Формат: +996XXXXXX")
class Meta:
model = Staff
fields = "name position phone_number email img".split()
def save(self, commit=True):
staff = super().save(commit=False)
if self.cleaned_data.get("img"):
img_file = self.cleaned_data["img"]
upload_response = cloudinary.uploader.upload(img_file)
staff.img = upload_response['secure_url']
if commit:
staff.save()
return staff
admin.py:
from django.contrib import admin
from django.db import models
from django import forms
from .forms import StaffCustomForm
from .models import Staff
@admin.register(Staff)
class StaffAdmin(admin.ModelAdmin):
form = StaffCustomForm
formfield_overrides = {
models.ImageField: {'widget': forms.ClearableFileInput()},
}