Reputation: 1755
I have a blog project where auth.users can Post new posts. When sending POST message to server it is unable to add loggedin user with new posts.
VIEWS.PY
class PostListCreate(APIView):
parser_class = (FileUploadParser,)
permission_classes = [IsAuthenticatedOrReadOnly]
def post(self,request):
#postAuthor = self.request.user
serializer = PostSerializers(data=request.data,context={'request':request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
SERIALIZER.PY
class PostSerializers(serializers.ModelSerializer):
comments = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name = 'comment_details')
likes_count = serializers.SerializerMethodField()
user_has_voted = serializers.SerializerMethodField()
# postAuthor = serializers.SerializerMethodField()
class Meta:
model = Post
fields = '__all__'
#exclude=('voters',)
def get_likes_count(self, instance):
return instance.voters.count()
def get_user_has_voted(self, instance):
request = self.context.get("request")
return instance.voters.filter(pk=request.user.pk).exists()
ERROR MESSAGE
{
"postAuthor": [
"This field is required."
]
}
MODELS.PY
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=60)
body = models.CharField(max_length=60)
file = models.FileField(null=True,blank=True)
postAuthor = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='posts')
voters = models.ManyToManyField(settings.AUTH_USER_MODEL,
related_name="votes",blank=True)
Upvotes: 0
Views: 103
Reputation: 151
your problem should be in meta class:
all the fields are required, but postAuthor is not passed with input data.
class PostSerializers(serializers.ModelSerializer):
comments = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name = 'comment_details')
likes_count = serializers.SerializerMethodField()
user_has_voted = serializers.SerializerMethodField()
# postAuthor = serializers.SerializerMethodField()
class Meta:
model = Post
fields = '__all__'
#exclude=('voters',)
def get_likes_count(self, instance):
return instance.voters.count()
def get_user_has_voted(self, instance):
request = self.context.get("request")
return instance.voters.filter(pk=request.user.pk).exists()
in your serializer, change
fields = '__all__'
to
exclude=('postAuthor',)
and in views, change
if serializer.is_valid():
serializer.save()
to
if serializer.is_valid():
serializer.save(postAuthor=request.user)
this should help
Upvotes: 1
Reputation: 903
def post(self, request):
request.data["postAuthor"] = request.user
serializer = PostSerializers(data=request.data, context={'request': request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Try this.
Upvotes: 1