Django rest framework даже не показывает возможность загрузки изображения. У меня есть поле imageField в модели

django rest framework даже не показывает возможность загрузки изображения. У меня есть imageField в модели. Я также получаю GET http://127.0.0.1:8000/api/person-create/ 405 (Method Not Allowed) в консоли, когда перехожу по api url для создания нового элемента. TLDR Я пытаюсь загрузить изображения с помощью django rest framework, я могу сделать это из админки, но не с помощью DRF или фронтенда Любая помощь будет признательна Спасибо.

view.py

@api_view(['POST'])
def create_person(request):
    serializer = PersonSerializer(data=request.data)
    if serializer.is_valid(raise_exception=True):
        serializer.save()
    return Response(serializer.data)

serializer.py

class PersonSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(max_length=None, allow_empty_file=False, allow_null=True, required=True)

    class Meta():
        model = Person
        fields = 'name', 'about', 'created_at', 'email', 'image'
        

urls.py

urlpatterns = [
    path('', views.apiOverview, name='apiOverview'),
    path('persons/', views.all_persons, name='all_persons'),
    path('person/<str:pk>', views.person, name='person'),
    path('person-create/', views.create_person, name='create'),
    path('person-update/<str:pk>', views.update_person, name='update_person'),
    path('person-delete/<str:pk>', views.delete_person, name='delete_person'),
]

models.py

class Person(models.Model):
    name = models.CharField(max_length=50)
    about = models.CharField(max_length=10000)
    created_at = models.DateTimeField(auto_now_add=True)
    email = models.EmailField(unique=True)
    image = models.ImageField(blank=True, null=True, upload_to='media/', default='default.png')

Вот часть фронтенда create.js

Вы ограничили разрешенные методы только POST в вашем представлении, тогда ожидается, что вы получите 405 ошибку при выполнении GET. Вы можете добавить метод GET

@api_view(['POST', 'GET'])

Помните, что вам нужно будет обработать случай GET и вернуть что-то. Вы можете посмотреть пример в документации по drf здесь: https://www.django-rest-framework.org/api-guide/views/#api_view

Кроме того, в качестве хорошей практики в REST API следует избегать именования конечных точек с помощью действий типа -create, -update, -delete. Стандартом является наличие одного url для каждого ресурса, например persons/, а затем указывается, что POST будет использоваться для создания, GET будет использоваться для получения (один человек из списка), PUT/PATCH будет использоваться для обновления.

И все это вы можете легко сделать, используя DRF routers и viewsets, или ModelViewSet, более подходящий для вашего случая. Смотрите больше в документации по drf здесь:

https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

https://www.django-rest-framework.org/api-guide/routers/#routers

Вернуться на верх