0

I have a model in Django for holding the details of the user's profile like:

class UserDetails(models.Model):

    def getFileName(self, filename):
        return 'profile_pics/'+str(self.user.id)+'/'+filename

    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    profile_picture = models.ImageField(blank = True, upload_to=getFileName)
    country = models.CharField(max_length = 50, default='South Africa')
    gender = models.CharField(max_length=10, default='NA')
    birthday = models.DateField(default=datetime.now())

    phone = models.CharField(max_length=15)

    verified = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

Then, I wrote a REST API that would handle POST requests to create a user profile like:

from django.shortcuts import render

from rest_framework import status
from rest_framework.decorators import api_view, authentication_classes, permission_classes, parser_classes
from rest_framework.parsers import FormParser, MultiPartParser, FileUploadParser
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

from datetime import datetime

from django.contrib import messages, auth
from django.contrib.auth.models import User

from userMgmt.models import UserDetails

@api_view(['POST'])
@parser_classes(['FormParser', 'MultiPartParser', 'FileUploadParser'])
def signUp(request):
    if request.method == 'POST':
        data = request.data

        ## Creating a basic user
        user = User.objects.create_user(data['first_name'], data['email'], data['password'])
        user['last_name'] = data['last_name']
        user.save()

        ## Creating a profile for the user
        user_details = UserDetails()
        user_details.user = user
        user_details.profile_picture = data['profile_picture']
        user_details.country = data['country']
        user_details.gender = data['gender']
        user_details.birthday = datetime.strptime(data['birthday'], '%m/%d/%y')
        user_details.phone = data['phone']
        user_details.verified = False

        user_details.save()
        return Response({'message': 'Profile created Successfully'})

Then, I made a request to this REST API using Postman like: Postman request screenshot

After that, I got the following error:

Internal Server Error: /services/authentication/signup/
Traceback (most recent call last):
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 488, in dispatch
    request = self.initialize_request(request, *args, **kwargs)
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 389, in initialize_request
    parsers=self.get_parsers(),
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 266, in get_parsers
    return [parser() for parser in self.parser_classes]
  File "/home/suraj/Work/Speeve/speeve-backend/speeveEnv/lib/python3.6/site-packages/rest_framework/views.py", line 266, in <listcomp>
    return [parser() for parser in self.parser_classes]
TypeError: 'str' object is not callable
[06/Apr/2020 06:45:47] "POST /services/authentication/signup/ HTTP/1.1" 500 96805

I have added rest_framework to the INSTALLED_APPS list in my settings. And I have also added REST_FRAMEWORK to my settings as:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FileUploadParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}

What are the necessary changes that I have to make in order to get my REST API for signing up an user to get working?

Please Help

Cheers!!!

Suraj S Jain
  • 515
  • 3
  • 10
  • 24

1 Answers1

0

Please make sure you are setting Content-Type header in the header tab in Postman as the correct value for handling form data.

Content-Type : application/x-www-form-urlencoded

Also you can also try sending your form data as json format by selecting raw and then selecting json in the right hand most tab. Also set the Content-Type header as

Content-Type : application/json
Utsavkumar Lal
  • 109
  • 1
  • 10
  • I tried `x-www-form-urlencoded` and I am not able to attach an image along with the request. Do you know how to attach the image file with JSON? – Suraj S Jain Apr 06 '20 at 07:23
  • I have never tried sending an image but you can look at this answer [link](https://stackoverflow.com/questions/34485420/how-do-you-put-an-image-file-in-a-json-object/34485762) – Utsavkumar Lal Apr 06 '20 at 11:12