I'm trying to use function based view to create a new object, but keeps shows this error:
HTTP 405 Method Not Allowed Allow: GET, OPTIONS Content-Type: application/json Vary: Accept
{ "detail": "Method "POST" not allowed." }
I've read alot stackoverflow questions, but none of them worked for me, here is my code:
@api_view(['POST'])
@permission_classes([permissions.IsAuthenticated])
def todo_create(request,format=None):
if request.method == 'POST':
serializer = TodoSerializer(data=request.data)
if serializer.is_valid():
serializer.owner = request.user
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
urls
urlpatterns = [
path('',todo_links,name='todo_links'),
path('lists/',todo_lists,name='todo_lists'),
path('create/',todo_create,name='todo_create'),
path('lists/<int:pk>/',todo_detail,name='todo_detail'),
path('lists/<int:pk>/update',todo_update,name='todo_update'),
path('lists/<int:pk>/delete',todo_delete,name='todo_delete'),
path('data',template,name='template'),
]
main url
from snippet.views import api_root
urlpatterns = [
path('admin/', admin.site.urls),
path('auth/',include('django.contrib.auth.urls')),
path('posts/',include('post.urls')),
path('api-auth/',include('rest_framework.urls')),
path('',include('snippet.urls')),
path('todo/',include('todos.urls'),name='todos-app'),
]
my settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
],
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':1
}
serializers.py
class TodoSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.HyperlinkedIdentityField(view_name='user-detail',format='html')
class Meta:
model = Todo
fields = ['id','owner','title','describe','complete']
my models.py
class Todo(models.Model):
owner = models.ForeignKey(User,on_delete=models.CASCADE,related_name='todos')
title = models.CharField(max_length=255)
describe = models.TextField(null=True,blank=True)
complete = models.BooleanField(default=False)
def __str__(self):
return self.title
i know how to implement it with class based view, i'm not sure why it shows that error with function based view. thank you in advance