2014-06-18 70 views
1

我想讓它可以上傳文件和文本到我的服務器端點。Django Rest Framework說沒有提供輸入?

下面是捲曲的例子後,我希望能有工作:

curl -X POST https://mydomain.com/myapp/ -u user:pass -F "body=test" -F "[email protected]/Users/myaccount/myproject/eyecon.png" 

問題是,當我運行它,我得到這個錯誤信息:

{"non_field_errors": ["No input provided"]} 

我通過看Django Rest框架代碼,它僅從一個位置生成此錯誤消息,這是用於處理request.DATArequest.FILES都爲空/缺失的情況。所以我懷疑我的問題是在配置文件中的某處(可能是Apache,Django或Django Rest Kit的配置,我搞砸了)。我希望有人會告訴我,我在某處丟失了一行,這將是一個快速和簡單的修復。

但只是櫃面它不是一個配置的問題,它實際上是我的代碼的問題,這裏是我所有的代碼與此相關:

views.py

class MessageList(generics.ListCreateAPIView): 
    permission_classes = (IsAuthenticatedOrReadOnly,) 
    queryset   = Message.objects.all() 
    serializer_class = MessageSerializer 

    def pre_save(self, obj): 
     obj.owner = self.request.user 

串行的.py

class MessageSerializer(serializers.ModelSerializer): 
    owner = serializers.Field(source='owner.username') 

    def __init__(self, instance=None, data=None, files=None, 
       context=None, partial=False, many=None, 
       allow_add_remove=False, **kwargs): 
     super(MessageSerializer, self).__init__(**kwargs) 
     for attachment in files.getlist('file', []): 
      Attachment(target=id, file=attachment).save() 

    class Meta: 
     model = Message 
     fields = ('id', 'owner', 'title', 'created', 'body') 

models.py

class Message(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=100, blank=True, default='') 
    body = models.TextField() 
    owner = models.ForeignKey('auth.User', related_name='messages') 

    class Meta: 
     ordering = ('created',) 

class Attachment(models.Model): 
    target = models.ForeignKey('server_app.Message', related_name='attachments') 
    theFile = models.FileField(upload_to='attachments/') 

回答

1

我的問題是在serializers.py。當我打電話給super(...).__init__(**kwargs)時,我忽略了所有其他收到的論據。因此,串行器抱怨沒有得到輸入,因爲我沒有給它輸入。

通過更換我的電話之前更正它super(...).__init__(...)有:

super(MessageSerializer, self).__init__(self, instance=instance, data=data, files=files, 
             context=context, partial=partial, many=many, 
             allow_add_remove=allow_add_remove, **kwargs) 
+0

你不想同時省略「自我」使用提供給MessageSerializer的參數,而不是重複使用默認的?像這樣:super(MessageSerializer,self).__ init __(instance,data,files,context,partial,many,allow_add_remove,** kwargs) –

+0

@ user640916 - 是的,您是對的。這不是我項目中的實際代碼(由NDA覆蓋)。在我的匿名過程中,我偶然寫了一些沒有多大意義的代碼。我編輯了我的答案來解決這個問題。 – ArtOfWarfare

相關問題