2015-09-16 12 views
6

OutputError

{ 
"item_image": [ 
    "The submitted data was not a file. Check the encoding type on the form." 
], 
"item_thumb": [ 
    "The submitted data was not a file. Check the encoding type on the form." 
] 
} 

dati che sto postando èI dati inviati non erano un file. Controllare il tipo di codifica sul modulo in DRF 3

ingresso

{ 
    "item_name": "Lural", 
    "item_image": "/home/prashant/Desktop/suede.png", 
    "item_thumb": "/home/prashant/Desktop/suede.png", 
    "item_description": "sd", 
    "item_mass": 1, 
    "item_category": "Make Up", 
    "item_sub_category": "Sub-Feminine", 
    "item_est_price": "123.12", 
    "item_wst_price": "120.34" 
} 

per applicazioni tipo di supporto/JSON

vista .py

@api_view(['GET', 'POST']) 
def product_list(request): 
    if request.method == 'POST': 
     serializer = ProductSerializer(data=request.data) 
     # data.encode("base64") 
     if serializer.is_valid(): 
      serializer.save() 
      res_msg = {'Success_Message' : 'Created','Success_Code' : 201} 
      return Response(res_msg) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

models.py

class Product(models.Model): 
    item_category_choices = (
     ('Make Up','Make Up'), 
     ('Skin Care','Skin Care'), 
     ('Fragrance','Fragrance'), 
     ('Personal Care','Personal Care'), 
     ('Hair Care','Hair Care'), 
    ) 
    item_name = models.CharField(max_length=50) 
    item_image = models.ImageField() 
    item_thumb = models.ImageField() 
    item_description = models.TextField(max_length=200) 
    item_mass = models.IntegerField() 
    item_category = models.CharField(max_length=20,choices = item_category_choices) 
    item_sub_category = models.CharField(max_length=20) 
    item_est_price = models.DecimalField(max_digits=15,decimal_places=2) 
    item_wst_price = models.DecimalField(max_digits=15,decimal_places=2) 

    def __unicode__(self): 
     return self.item_name or _('Sprint ending %s')% self.item_avg_price 

serializers.py

class ProductSerializer(ModelSerializer): 

    class Meta: 
     model = Product 
     fields = ('id','item_name' ,'item_image','item_thumb','item_description','item_mass','item_category', 
       'item_sub_category','item_est_price','item_wst_price',) 

provato molti forum & pacchetti di terze parti troppo, ma la loro non è alcun modo per uscire da questo problema. Anche GET funziona perfettamente.

Grazie per il vostro tempo

+0

hey sei arrivato la soluzione per questo problema? –

risposta

1

Da Django Docs -

Se avete intenzione di consentire agli utenti di caricare i file, è necessario assicurarsi che l'ambiente utilizzato per eseguire Django è configurato per funzionare con i nomi di file non-ASCII . Se il tuo ambiente non è configurato correttamente, troverai eccezioni UnicodeEncodeError durante il salvataggio di file con nomi di file contenenti caratteri non ASCII.

Così l'aggiunta di questo metodo per il modello risolto il problema:

class Product(models.Model): 
item_category_choices = (
    ('Make Up','Make Up'), 
    ('Skin Care','Skin Care'), 
    ('Fragrance','Fragrance'), 
    ('Personal Care','Personal Care'), 
    ('Hair Care','Hair Care'), 
    ) 
item_name = models.CharField(max_length=50,verbose_name='Product Name') 
item_image = models.ImageField(verbose_name='Product Image') 
item_thumb = models.ImageField(verbose_name='Product Thumb') 
item_description = models.TextField(verbose_name='Product Descriptions') 
item_mass = models.CharField(max_length=10,verbose_name='Product Weight') 
item_category = models.CharField(max_length=20, choices = item_category_choices,verbose_name='Product Category') 
item_sub_category = models.CharField(max_length=20,verbose_name='Product Sub Category') 
item_est_price = models.DecimalField(max_digits=12,decimal_places=2,verbose_name='East Product Price') 
item_wst_price = models.DecimalField(max_digits=12,decimal_places=2,verbose_name='West Product Price') 
def __unicode__(self): 
      return (self.item_name) 
def image_img(self): 
    if self.item_image: 
     return u'<img src="%s" width="50" height="50" />' % self.item_image.url 
    else: 
     return '(Sin imagen)' 
image_img.short_description = 'Thumb' 
image_img.allow_tags = True 
+0

Ho ancora ricevuto questo errore: '{" immagine ": [" Carica un'immagine valida. "Il file che hai caricato non era un'immagine o un'immagine danneggiata."]} ' –

+0

Hai aggiunto il percorso del file nel sezione dei contenuti di drf ?? –

+0

Ho anche controllato la codifica del file system nella shell python e supporta i nomi di file UFT-8 .. –

2

Invece di presentare un link a un file "/home/prashant/Desktop/suede.png", è necessario aprire effettivamente il file e sostengono che, invece.

Per esempio, ecco un test di devo testare immagine presentazione:

# generate image and open 
tmp_file = Image.new('RGB', (3, 3,), 'white') 
tmp_file.putpixel((1, 1,), 0) 
tmp_file.save(f.name, format='PNG') 
_file = open(f.name, 'rb') 


data = {'file': _file} 

response = api.client.put(url=url, data=data) 
+0

Puoi per favore elaborare la tua risposta un po 'di più. Sarà utile. Grazie –

+0

Ho provato la tua soluzione ma response.status_code è 400, dovrebbe essere 201 –

+0

@djq Come aggiungere questo nella sezione contenuto del django rest framework? –

0

Si dovrebbe aprire l'immagine e invia la richiesta come segue:

with open("/home/prashant/Desktop/suede.png", 'rb') as image: 
    data = {'item_name': 'Lural', 
      'item_image': image, 
      'item_thumb': image, 
      'item_description': 'sd', 
      'item_mass': 1, 
      'item_category': 'Make Up', 
      'item_sub_category': 'Sub-Feminine', 
      'item_est_price': '123.12', 
      'item_wst_price': '120.34' 
      } 
    response = api.client.put(url, data, format='multipart') 

questo dovrebbe funzionare!

+1

Come aggiungere questo nella sezione del contenuto del quadro di riposo django ?? –

+0

Scusa se non capisco, puoi spiegarci un po 'di più? – vabada

+0

Sono bloccato nella stessa identica situazione. potresti vedere http://stackoverflow.com/q/35884951/5080347 come riferimento. Ho allegato alcune istantanee per il framework django rest. Nella parte del contenuto del drf avevo aggiunto i dati nello stesso modo dell'OP di questa domanda, cioè avevo dato la posizione del file nel campo dell'immagine e non funzionava.Hai suggerito che il file deve essere aperto per primo e poi inviare la richiesta. Non so come posso farlo in drf, apro il file nella parte del contenuto e poi invio la richiesta solo nella parte del contenuto. Spero di essere chiaro ora. :) –