簡體   English   中英

Django REST框架上傳圖片時出錯,提交的數據不是文件

[英]Django rest framework error while uploading image, submitted data is not file

我是 Django 休息框架的新手,當我嘗試通過 Postman 和 python 腳本本身進行發布請求時,它會顯示錯誤

{'bloodbank_logo': ['提交的數據不是文件。 檢查表單上的編碼類型。']}

但是當我嘗試使用 django admin 發布圖像時沒有錯誤。

我的模型.py

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User

# Create your models here.

class Bloodbanks(models.Model):
    bloodbank_user=models.ForeignKey(User, on_delete=models.CASCADE)
    fullbankname=models.CharField(max_length=80,blank=False,default='Null')
    apositive=models.PositiveIntegerField()
    anegative=models.PositiveIntegerField()
    bpositive=models.PositiveIntegerField()
    bnegative=models.PositiveIntegerField()
    abpositive=models.PositiveIntegerField()
    abnegative=models.PositiveIntegerField()
    opositive=models.PositiveIntegerField()
    onegative=models.PositiveIntegerField()
    latitude=models.CharField(max_length=20,blank=False,default='Null')
    longitude=models.CharField(max_length=20,blank=False,default='Null')
    state = models.CharField(max_length=100)
    district=models.CharField(max_length=20,blank=False,default='Null')
    location=models.CharField(max_length=20,blank=False,default='Null')
    website = models.CharField(max_length=100, blank=True)
    bloodbank_logo=models.ImageField(blank=False)
    bloodbank_description=models.CharField(blank=True,max_length=200)
    bloodbank_phone=models.CharField(blank=True,max_length=10)


    def __str__(self):  
        return self.fullbankname

我的序列化程序.py

from rest_framework import serializers,reverse
from bloodbank_api.models import Bloodbanks


class BloodbankdataSerializer(serializers.ModelSerializer):
    bloodbanks_user=serializers.PrimaryKeyRelatedField(source='user.username',read_only=True)
    url = serializers.HyperlinkedIdentityField(
        view_name='bloodbank-detail-id',
        lookup_field='pk'
    )
    bloodbank_logo=serializers.ImageField
    
    class Meta:
        model=Bloodbanks
        fields=['id','bloodbanks_user','fullbankname','apositive',
                'anegative','bpositive','bnegative','abpositive',
                'abnegative','opositive','onegative','latitude',
                'longitude','state','district','location','website',
                'bloodbank_logo','bloodbank_description','bloodbank_phone','url']
    

視圖.py

from bloodbank_api.models import Bloodbanks
from bloodbank_api.serializers import BloodbankdataSerializer
from rest_framework import status,mixins,generics
from rest_framework.parsers import FormParser, MultiPartParser,JSONParser
from rest_framework.response import Response
from django.contrib.auth.models import User

  # Create your views here
#updatelistpostput by primary key        
class BloodbankDataDetail(mixins.ListModelMixin,
                        mixins.CreateModelMixin,
                        mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        mixins.DestroyModelMixin,
                        generics.GenericAPIView):
    queryset = Bloodbanks.objects.all()
    serializer_class = BloodbankdataSerializer
    parser_class=(MultiPartParser,JSONParser, FormParser) 
    lookup_field = 'pk'
    def get(self, request,*args, **kwargs):
        id=kwargs.get('pk')
        if id is not None:
            return self.retrieve(request,*args, **kwargs)
        return self.list(request, *args, **kwargs)
    def post(self, request, *args, **kwargs):
        print(args,kwargs)
        return self.create(request, *args, **kwargs)

    def perform_create(self, serializer):
        serializer.save(bloodbank_user=self.request.user)
    

網址.py

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from bloodbank_api.views import  BloodbankDataDetail
from django.conf import settings
from django.conf.urls.static import static

urlpatterns=[
    path('bloodbank/',BloodbankDataDetail.as_view(),name='bloodbank-detail'),
    path('bloodbank/<int:pk>/',BloodbankDataDetail.as_view(),name='bloodbank-detail-id'),
]
urlpatterns = format_suffix_patterns(urlpatterns)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我用來發布的python腳本做發布請求

import requests
endpoint='http://127.0.0.1:8000/bloodbank/'
data={
    "fullbankname": "Dirgahyu",
    "apositive": '1',
    "anegative": '1',
    "bpositive": '1',
    "bnegative": '1',
    "abpositive": '1',
    "abnegative": '1',
    "opositive": '1',
    "onegative": '1',
    "latitude": "dhdhd",
    "longitude": "hdhdd",
    "state": "dhhd",
    "district": "dhdhgd",
    "location": "dhdhdhd",
    "website": "jdjdjd",
    "bloodbank_logo": "/Users/aayushdipgiri/aayu's code/opencv/cat.jpeg",
    "bloodbank_description": "hahaha",
    "bloodbank_phone": "hhdhddh"
}
get_response = requests.post(endpoint, json=data) 
print(get_response.json())

我注意到的第一件事是您不是在發送圖像,而是在發送字符串。 試試這個,而不是通過requests模塊發送文件。

"bloodbank_logo": open("/Users/aayushdipgiri/aayu's code/opencv/cat.jpeg", "rb"),

如果這不起作用,我會嘗試使用 django 的FileField ,但我不會詳細說明,因為上面應該可以工作或至少給你一個不同的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM