2016-08-14 1 views
0

イムをしようとはジャンゴRESTバックエンドにiOSアプリケーションから画像のリストを送信します。これはAlamoFireを使用したiOSリクエストです。- iOSのクライアントが

iOSのコード:

let URL = "myURL" 
     var imagesDictonaryList = [[String : AnyObject]]() 
     var images = [UIImage]() 
     for _ in 1...3 { 
      images.append(UIImage(named: "profileImagePlaceholder")!) 
     } 
     //let imagesData = imagesToBase64(images) 
     for index in 0..<3 { 
      var myDictionary = [String:AnyObject]() 
      myDictionary["name"] = "\(index)" 
      myDictionary["image"] = images[index] 
      imagesDictonaryList.append(myDictionary) 
     } 
     print(imagesDictonaryList) 
     let parameters = [ 
      "title": "service 1 title", 
      "description": "service 1 description", 
      "price": "11", 
      "images": imagesDictonaryList 
     ] 
     Alamofire.request(.POST, URL, parameters: parameters as? [String : AnyObject]).responseJSON { response in 
      print(response.request) // original URL request 
      print(response.response) // URL response 
      print(response.data)  // server data 
      print(response.result) // result of response serialization 
      if let dataString = String(data: response.data!, encoding: NSUTF8StringEncoding) { 
       print(dataString) 
      } 
      if let JSON = response.result.value { 
       print("JSON: \(JSON)") 
      } 
     } 

サーバコード:

views.py

class PredefinedServiceList(APIView): 
    """ 
    List all Predefined Services, or create a new Predefined Service 
    """ 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request): 
     serializer = PredefinedServiceSerializer(data=request.POST) 
     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) 

serializers.py

class ServiceImageSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     b64_text = validated_data.get('image', None) 

     image_data = b64decode(b64_text) 
     image_content = ContentFile(b"%s" % image_data, 'whatup.jpg') 

     validated_data['image'] = image_content 

     instance = ServiceImage.objects.create() 
     instance.save() 
     return instance 

    class Meta: 
     model = ServiceImage 
     fields = ('image', 'name') 


class PredefinedServiceSerializer(serializers.ModelSerializer): 
    images = ServiceImageSerializer(many=True) 

    class Meta: 
     model = PredefinedService 
     fields = ('title', 'description', 'price', 'images') 

    def create(self, validated_data): 
     images_data = validated_data.pop('images') 
     service = PredefinedService.objects.create(**validated_data) 

     for image in images_data: 
      new_image, created = ServiceImage.objects.get_or_create(name=image.get('name', None)) 
      new_image.image = image.get('image', None) 

      new_image.save() 

      service.images.add(new_image) 
     return service 

models.py

class ServiceImage(models.Model): 
    image = models.ImageField(upload_to="predefined", null=True) 
    name = models.CharField(max_length=9001, null=True) 

class PredefinedService(models.Model): 
    title = models.CharField(max_length=100, null=True, blank=True, default="untitled") 
    description = models.TextField(default="No description available.") 
    price = models.FloatField(default=0.000) 
    images = models.ForeignKey(ServiceImage, null=True, blank=True) 

問題は、画像がコード内request.dataではないが、送信された他のすべての情報があることです。

イメージは、iOSクライアントリクエスト後の空のリストにすぎません。リスト[0]をハードコーディングして最初に受信した画像を見ると、HTMLが取得する「範囲外のインデックス」です。

このコードにはどのような問題がありますか?どのようにそれを解決するには?これを実装するためのよりよい方法はありますか?

答えて

0

ファイルはそう、あなたが

serializer = PredefinedServiceSerializer(data=request.POST, files=request.FILES) 

serializer = PredefinedServiceSerializer(data=request.POST) 

を変更する必要があります

request.FILES 

を介してアクセスすることができます。しかし、あなたが応じて、その後、3.0よりも高いDRFを使用している場合docsには、これを行う正しい方法はデータ属性

を使用しています
+0

あなたの回答に感謝しますが、問題は上記の変更でも表示されます。 –

関連する問題