【问题标题】:Django Rest Framework - CreateAPIView doesn't let use POST methodDjango Rest Framework - CreateAPIView 不允许使用 POST 方法
【发布时间】:2017-08-30 05:30:17
【问题描述】:

我尝试创建一个视图,它将接受 POST 请求并创建我的模型的新实例(见帖子底部)。我遵循this 教程。问题是,当我访问与视图关联的 URL 时,它继承自 CreateAPIView,我没有看到用于创建新实例的 API 的 html 表示形式,而且我还看到它接受 GET 请求,而不是文档中提到的 POST。

页面是这样的

我的意见.py

from django.shortcuts import render
from rest_framework.generics import ListAPIView, CreateAPIView
from datingapp.models import Profile
from .serializers import ProfileSerializer, ProfileCreateSerializer

class ProfilesAPIView(ListAPIView):
  queryset = Profile.objects.all()
  serializer_class = ProfileSerializer

class ProfileCreateAPIView(CreateAPIView):
  queryset = Profile.objects.all()
  serializer_class = ProfileCreateSerializer

我的 urls.py

from django.conf.urls import url
from django.contrib import admin

from datingapp.views import ProfilesAPIView, ProfileCreateAPIView

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'api/profiles/', ProfilesAPIView.as_view(), name='list'),
   url(r'api/profiles/create/$', ProfileCreateAPIView.as_view(), name='create')
   ]

我的序列化器.py

from rest_framework.serializers import ModelSerializer
from datingapp.models import Profile

class ProfileSerializer(ModelSerializer):
  class Meta:
    model = Profile
    fields = [
        'name',
        'age',
        'heigth'
        'location',
    ]

class ProfileCreateSerializer(ModelSerializer):
  class Meta:
    model = Profile
    fields = [
        'name',
        'age',
        'heigth'
        'location',
    ]  

在我的 settings.py 中,我安装了 crispy_forms。

我做错了什么?

UPD:这就是我想要实现的目标

如您所见,有一个表单,它只接受 POST 并表示不允许 GET

【问题讨论】:

  • 您想知道为什么CreateApiView 不接受GET 吗?你会期待什么回应?如果要在同一条路由上使用多个方法,可以使用 ModelViewSets。
  • 我想实现和底部截图一样的效果
  • 好的。我误解了。你的问题现在很有意义。回复看起来不像我期望的 CreateAPIView。它看起来像 ListAPIView
  • 可能是由于您的权限设置。在我的 django 设置中REST_FRAMEWORK = {...'DEFAULT_PERMISSION_CLASSES: ['rest_framework.permissions.AllowAny']'} 这当然是最佳实践,并且应该始终进行某种身份验证。

标签: django django-rest-framework


【解决方案1】:

问题出在您的路由器上。第一个模式匹配api/profiles/api/profiles/create/,因此永远不会评估第二个模式。您看到的是 ProfilesAPIView 而不是创建视图。

 url(r'api/profiles/', ProfilesAPIView.as_view(), name='list'),
 url(r'api/profiles/create/$', ProfileCreateAPIView.as_view(), name='create')

要修复它,要么交换 URL 的顺序,要么在第一个模式的末尾添加 $r'api/profiles/$'

【讨论】:

    【解决方案2】:

    我正在学习一个教程并且遇到了类似的问题。可能我没有遵循相同版本的 Django Rest Framework 并且它们发生了变化。 但我这样做解决了这个问题。

    class AssetBundleList(generics.ListAPIView):
    

    class AssetBundleList(generics.ListCreateAPIView):
    

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 2021-06-19
      • 2018-12-22
      • 2021-04-05
      • 1970-01-01
      • 2017-07-16
      • 2019-05-04
      • 2017-03-23
      相关资源
      最近更新 更多