Reputation: 99
I'd like to post to my Django server using POST so I can add a employee item.
views.py
class EmployeeList(generics.ListAPIView):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
class EmployeeDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
models.py
class Employee(models.Model):
firstname=models.CharField(max_length=10)
lastname=models.CharField(max_length=10)
emp_id=models.IntegerField()
def __str__(self):
return self.firstname;
serializer.py
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model=Employee
# fields={'firstname','lastname'}
fields='__all__'
My POST request:
{
"id": 8,
"firstname": "zxcvb",
"lastname": "bnmmm",
"emp_id": 3
}
Error I got:
{
"detail": "Method \"POST\" not allowed."
}
Even after using generics.RetrieveUpdateDestroyAPIView
I can't POST, PUT or DELETE.
PS: I’m new to Django REST framework.
Upvotes: 1
Views: 1458
Reputation: 1152
To provide a post
method handler you'll need a view with a create()
action (CreateAPIView
or ListCreateAPIView
). Check the documention about concrete view classes.
Change your EmployeeList
view to inherit from ListCreateAPIView
for add read-write endpoints to represent a collection of employees
class EmployeeList(generics.ListCreateAPIView):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
Now, just register the views with the URL conf as usual
urlpatterns = [
path('employees/', EmployeeList, name='employee-list'),
path('employees/<int:pk>/', EmployeeDetail, name='employee-detail'),
]
Concrete view classes map methods defined in mixins such ListModelMixin
, CreateModelMixin
, RetrieveModelMixin
, etc. to HTTP methods. By defaults, theese actions (see here) are mapped to the following HTTP methods
list
- get
create
- post
retrieve
- get
update
- put
partial_update
- patch
destroy
- delete
Upvotes: 1