Django Rest Framework - CreateAPIView不允许使用POST方法

时间:2016-06-03 16:43:40

标签: django django-rest-framework

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

页面看起来像这样

enter image description here

我的views.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')
   ]

我的serializers.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:这就是我想要实现的目标

enter image description here

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

2 个答案:

答案 0 :(得分:14)

问题出在你的路由器上。第一个模式匹配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')

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

答案 1 :(得分:2)

我正在关注教程并遇到类似的问题。可能我没有遵循相同版本的Django Rest Framework并且他们有变化。 但是我解决了这个问题。

class AssetBundleList(generics.ListAPIView):

class AssetBundleList(generics.ListCreateAPIView):

希望这有助于某人。