2016-06-03 3 views
4

Ich versuche eine Ansicht zu erstellen, die POST-Anfragen akzeptiert und neue Instanzen meines Modells erstellt (siehe unten im Beitrag). Ich folge this Tutorial. Das Problem ist, dass, wenn ich auf die URL zugreife, die mit Ansicht assoziiert ist, die von CreateAPIView erbt, sehe ich kein Formular in HTML-Darstellung der API für die Erstellung neuer Instanzen und sehe auch, dass es GET-Anfragen akzeptiert, nicht POST wie in der Dokumentation erwähnt.Django Rest Framework - CreateAPIView lässt keine POST-Methode verwenden

Seite sieht wie folgt aus

enter image description here

Mein 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 

Mein 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') 
    ] 

Mein 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', 
    ] 

In meiner settings.py habe ich crispy_forms installiert.

Was mache ich falsch?

UPD: hier ist das, was ich

enter image description here

erreichen wollen Wie Sie dort sehen, ist eine Form, und es nimmt nur POST und sagt auch, dass GET nicht

+0

Fragen Sie sich, warum 'CreateApiView'' GET' nicht akzeptiert? Welche Antwort erwarten Sie? Wenn Sie mehrere Methoden auf derselben Route verwenden möchten, können Sie ModelViewSets verwenden. –

+0

Ich möchte dasselbe erreichen wie auf dem Screenshot unten –

+0

Ok. Ich habe es falsch verstanden. Deine Frage macht jetzt Sinn. Die Antwort sieht nicht so aus, wie ich es von einer CreateAPIView erwarten würde. Es sieht aus wie eine 'ListAPIView' –

Antwort

7

erlaubt ist Das Problem ist in Dein Router. Das erste Muster entspricht sowohl api/profiles/ als auch api/profiles/create/, so dass das zweite Muster niemals ausgewertet wird. Sie sehen die ProfilesAPIView anstelle der Create-Ansicht.

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

es zu beheben, entweder die Reihenfolge der URLs tauschen oder ein $ bis zum Ende des ersten Musters hinzuzufügen. r'api/profiles/$'

+0

Kein Problem. Diese Regex Bugs können manchmal sehr schwer zu finden sein. In den meisten Fällen sollten Sie die Begrenzer '^' und '$' in Ihren URL-Mustern verwenden, um das Routing strikt und vorhersagbar zu machen. –

0

Ich folgte einem Tutorial und hatte ein ähnliches Problem. Wahrscheinlich folgte ich nicht der gleichen Version von Django Rest Framework und sie hatten Änderungen. Aber ich löste dieses Problem dabei.

class AssetBundleList(generics.ListAPIView): 

zu

class AssetBundleList(generics.ListCreateAPIView): 

hoffe, das hilft jemand.

Verwandte Themen