简体   繁体   中英

how to access request data sent as form-data to Django rest framework

I'm sending a POST request with a body as FormData from my flutter application to my Django backend.. the body has both MultiPart Files and String but when I try to access data in my backend some of them are not accessible.. here is my code:

flutter form-data body

    FormData form = FormData({
      "mobile_number": supplierMobileController.text,
      "password": supplierPasswordController.text,
      "firebase_token": "123456789",
      "main_user": {
        "username": supplierMobileController.text,
        "password": "123456789"
      },
      "client_object": null,
      "supplier_object": {
        "personal_name": supplierPersonalNameController.text,
        "company_name": supplierCompanyNameController.text,
        "email": supplierEmailController.text,
        "established": supplierMonthController.text.length == 2
            ? "${supplierYearController.text}-${supplierMonthController.text}-01"
            : "${supplierYearController.text}-0${supplierMonthController.text}-01",
        "number_of_projects": supplierNumberOfProjectsController.text,
        "tax_id": MultipartFile(File(imageOne.value),
            filename: "${supplierCompanyNameController.text}_tax_image.png"),
        "company_logo": MultipartFile(File(imageTwo.value),
            filename: "${supplierCompanyNameController.text}_logo_image.png"),
        "business_register": MultipartFile(File(imageThree.value),
            filename:
                "${supplierCompanyNameController.text}_business_image.png"),
        "company_text": ""
      },
    });

and this is how am trying to access this data in the backend:

Django Backend function

@permission_classes(["AllowAny"])
@parser_classes(["JSONParser"])
@api_view(['POST'])
def create_new_supplier(request):
    '''
    Handles API call to create a new supplier
    '''
    data = {}
    if request.method == 'POST':
        main_user_serializer = MainUserSerializer(data=request.data['main_user']) # causes an error
        main_user_serializer.is_valid(True)
        main_user_data = main_user_serializer.data
        app_user_serializer = AppUserSerializer(data=request.data)
        app_user_serializer.is_valid(True)
        validated_data = app_user_serializer.data
        supplier_serializer = models.Supplier(data=request.data['supplier_object'])
        supplier_serializer.is_valid(True)
        supplier_object_data = supplier_serializer.data
        main_user_object = User.objects.create_user(**main_user_data)
        app_user = models.AppUser.objects.create(**validated_data)
        token_object = Token.objects.create(user=main_user_object)
        supplier_object = models.Supplier.objects.create(**supplier_object_data)
        app_user.token = token_object
        app_user.client_object = None
        app_user.supplier_object = supplier_object
        app_user.main_user = main_user_object
        app_user.is_active = False
        app_user.save()
        data = {
            "success" : True,
            "details":AppUserSerializer(app_user).data,
        }
        return Response(data, headers=get_headers())

the line main_user_serializer = MainUserSerializer(data=request.data['main_user']) causes this error:

    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'main_user'

I recommend you send the data that is a dictionary

"main_user": json.encode({
    "username": supplierMobileController.text,
    "password": "123456789"
  }),

and in back it is better to receive the data like this

main_user_serializer=MainUserSerializer(data=json.loads(request.data.get('equipo')))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM