Я не могу разместить данные - Django

В настоящее время я создаю приложение Django React и хочу, чтобы пользователи могли создавать экземпляр модели (листинг) с фронтенда. Я пытался создать бэкенд, но когда я пробую url: http://localhost:8000/api/listings/create на Postman, я получаю ошибку : "detail": "Method "POST" not allowed."

Также, если я использую "/listings/admin/create" вместо этого, я не получаю эту ошибку.

Моя модель :

class Listing(models.Model):
        
  artist = models.ForeignKey(Artist, on_delete=models.DO_NOTHING)
  slug = models.CharField(max_length=200, unique=True)
  title = models.CharField(max_length=150)   
  photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/', default='photos/default.jpg') 
  description = models.TextField(blank=True)

  def __str__(self):
    return self.title
  

Мое мнение :

class CreateListingView(APIView):  
  parser_classes = [MultiPartParser, FormParser]
  queryset = Listing.objects.all()
  serializer_class = ListingSerializer

  def post(self, request, format=None):
    print(request.data)
    serializer = ListingSerializer(data=request.data)
    if serializer.is_valid():
      serializer.save()
      return Response(serializer.data,status=status.HTTP_200_OK)
    else:
      return Response(serializer.data,status=status.HTTP_400_BAD_REQUEST)

Урлы моих приложений :

from django.urls import path
from .views import ListingsView, ListingView, SearchView,CreateListingView

app_name = 'listings'

urlpatterns = [
path('', ListingsView.as_view(),name='listings'),
path('search', SearchView.as_view(),name='listingssearc'),
path('<slug>', ListingView.as_view(),name='listingsdetails'),
path('create', CreateListingView.as_view(),name='listingscreate')
]

Урлы моего проекта :

urlpatterns = [
path('api-auth/', include('rest_framework.urls')),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('api/accounts/', include('accounts.urls')),
path('api/artists/', include('artists.urls')),
path('api/listings/', include('listings.urls', namespace='listings')),
path('api/contact/', include('contact.urls')),
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += [re_path(r'^.*', TemplateView.as_view(template_name='index.html'))]

Итак, что я сделал не так? Я не понимаю, почему я получаю 405 ошибку.

Спасибо, что прочитали!

Это должно быть так:

class CreateListingView(APIView):  
  def post(self, request, format=None):
    print(request.data)
    serializer = ListingSerializer(data=request.data)
    if serializer.is_valid():
      serializer.save()
      return Response(serializer.data,status=status.HTTP_200_OK)
    else:
      return Response(serializer.data,status=status.HTTP_400_BAD_REQUEST)

Для справки смотрите этот drf APIView

Вы можете попробовать изменить

class CreateListingView(APIView):
к
class CreateListingView(generics.ListCreateAPIView)

Шаблон url пробуется одна строка за другой.

в ваших urlpatterns вы улавливаете вызов "create" в строке перед как slug:

urlpatterns = [
path('', ListingsView.as_view(),name='listings'),
path('search', SearchView.as_view(),name='listingssearc'),
path('<slug>', ListingView.as_view(),name='listingsdetails'),
path('create', CreateListingView.as_view(),name='listingscreate')
]

поэтому он отправляется в listingsdetails, который, очевидно, не разрешает почтовые запросы.

измените его на:

urlpatterns = [
path('', ListingsView.as_view(),name='listings'),
path('search', SearchView.as_view(),name='listingssearc'),
path('create', CreateListingView.as_view(),name='listingscreate'),
path('<slug>', ListingView.as_view(),name='listingsdetails')
]

тогда он будет пойман последней строкой, только если он имеет slug, который не является search или create.

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