提交的数据不是文件.检查DRF 3中表单上的编码类型

Pra*_*kla 7 python django django-models django-rest-framework

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."
]
}
Run Code Online (Sandbox Code Playgroud)

我发布的数据是

输入

{
    "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"
}
Run Code Online (Sandbox Code Playgroud)

适用于媒体类型应用/ json

views.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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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',)
Run Code Online (Sandbox Code Playgroud)

尝试了很多论坛和第三方套餐,但他们没有任何解决方案.GET工作也很好.

谢谢你的时间

Pra*_*kla 4

来自 Django 文档 -

\n\n
\n

如果您打算允许用户上传文件,则必须确保用于运行 Django 的环境配置为使用非 ASCII 文件名。如果您的环境配置不正确,则在保存文件名包含非 ASCII 字符的文件时,\xe2\x80\x99ll\n 会遇到 UnicodeEncodeError 异常。

\n
\n\n

因此,将此方法添加到模型中解决了我的问题:

\n\n
class Product(models.Model):\nitem_category_choices = (\n    (\'Make Up\',\'Make Up\'),\n    (\'Skin Care\',\'Skin Care\'),\n    (\'Fragrance\',\'Fragrance\'),\n    (\'Personal Care\',\'Personal Care\'),\n    (\'Hair Care\',\'Hair Care\'),\n    )\nitem_name = models.CharField(max_length=50,verbose_name=\'Product Name\')\nitem_image = models.ImageField(verbose_name=\'Product Image\')\nitem_thumb = models.ImageField(verbose_name=\'Product Thumb\')\nitem_description = models.TextField(verbose_name=\'Product Descriptions\')\nitem_mass = models.CharField(max_length=10,verbose_name=\'Product Weight\')\nitem_category = models.CharField(max_length=20, choices = item_category_choices,verbose_name=\'Product Category\')\nitem_sub_category = models.CharField(max_length=20,verbose_name=\'Product Sub Category\')\nitem_est_price = models.DecimalField(max_digits=12,decimal_places=2,verbose_name=\'East Product Price\')\nitem_wst_price = models.DecimalField(max_digits=12,decimal_places=2,verbose_name=\'West Product Price\')\ndef __unicode__(self):\n            return (self.item_name)\ndef image_img(self):\n    if self.item_image:\n        return u\'<img src="%s" width="50" height="50" />\' % self.item_image.url\n    else:\n        return \'(Sin imagen)\'\nimage_img.short_description = \'Thumb\'\nimage_img.allow_tags = True\n
Run Code Online (Sandbox Code Playgroud)\n