【问题标题】:I cannot post data - Django我无法发布数据 - Django
【发布时间】:2022-01-28 03:43:49
【问题描述】:

我目前正在构建一个 Django React 应用程序,我希望用户能够从前端创建模型(列表)的实例。 我正在尝试构建后端,但是当我在 Postman 上尝试 url: http://localhost:8000/api/listings/create 时出现错误:"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 错误。

感谢阅读!

【问题讨论】:

标签: django post django-models django-rest-framework django-views


【解决方案1】:

url-pattern 一行一行地被尝试。

在您的 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')
]

所以它会列出显然不允许发布请求的详细信息。

改成:

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,它只会被最后一行捕获。

【讨论】:

    【解决方案2】:

    应该是这样的:

    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)
    

    参考请看这个博士APIView

    【讨论】:

    • 感谢您的回答,我试过了,但遗憾的是它不起作用。
    • 尝试通用视图
    【解决方案3】:

    你可以试试改

    class CreateListingView(APIView):

    class CreateListingView(generics.ListCreateAPIView)

    【讨论】:

    • 感谢您的回答,我也试过了,但还是没有成功!
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多