Задать вопрос
@Showlden

No file was submitted. Check the encoding type on the form. Проблема с админкой и загрузкой на Cloudinary?

проблема с настройкой загрузки изображений на 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()},
    }
  • Вопрос задан
  • 33 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы