我倾向于如何在Django中上传文件,在这里我遇到一个应该是微不足道的问题,错误:
提交的数据不是文件.检查表单上的编码类型.
以下是详细信息.
注意:我也查看了Django Rest Framework ImageField,我试过了
serializer = ImageSerializer(data=request.data, files=request.FILES)
Run Code Online (Sandbox Code Playgroud)
但我明白了
TypeError:
__init__()得到一个意外的关键字参数'files'
我有一个Image模型,我想通过Django REST框架进行交互:
class Image(models.Model):
image = models.ImageField(upload_to='item_images')
owner = models.ForeignKey(
User, related_name='uploaded_item_images',
blank=False,
)
time_created = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
class ImageSerializer(serializers.ModelSerializer):
image = serializers.ImageField(
max_length=None, use_url=True,
)
class Meta:
model = Image
fields = ("id", 'image', 'owner', 'time_created', )
Run Code Online (Sandbox Code Playgroud)
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
),
Run Code Online (Sandbox Code Playgroud)
前端(使用AngularJS和angular-restmod或$resource)发送JSON与数据owner和image下面的形式:
{"owner": 5, …Run Code Online (Sandbox Code Playgroud) 我有一个有两个input text和一个的表格upload.我必须将它发送到服务器,但我有一些问题连接文件与文本.服务器期望这个答案:
"title=first_input" "text=second_input" "file=my_file.pdf"
Run Code Online (Sandbox Code Playgroud)
这是html:
<input type="text" ng-model="title">
<input type="text" ng-model="text">
<input type="file" file-model="myFile"/>
<button ng-click="send()">
Run Code Online (Sandbox Code Playgroud)
这是控制器:
$scope.title = null;
$scope.text = null;
$scope.send = function(){
var file = $scope.myFile;
var uploadUrl = 'my_url';
blockUI.start();
Add.uploadFileToUrl(file, $scope.newPost.title, $scope.newPost.text, uploadUrl);
};
Run Code Online (Sandbox Code Playgroud)
这是指令 fileModel:
return {
restrict: 'A',
link: function(scope, element, attrs) {
var model = $parse(attrs.fileModel);
var modelSetter = model.assign;
element.bind('change', function(){
scope.$apply(function(){
modelSetter(scope, element[0].files[0]);
});
});
}
};
Run Code Online (Sandbox Code Playgroud)
这就是服务 …
所以我一直试图将文件上传到使用DRF的方法到目前为止没有运气.
我能够上传到没有问题的ModelViewSet使用(FormParser, MultiPartParser,),但我真的需要在这样的http://localhost:8000/api/v1/women/{pk}/upload_avatar/地方使用它,我想先通过id过滤女人并上传到她的头像(这是多媒体模型的外键).我尝试使用嵌套资源库而没有运气.
到目前为止我在我的modelviewset中:
class WomenNativePassportViewSet(viewsets.ModelViewSet):
queryset = Women.objects.all()
serializer_class = WomenNativePassportSerializer
authentication_classes = (NoAuthentication,)
permission_classes = (AllowAny,)
parser_classes = (FormParser, MultiPartParser,)
@detail_route(
methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny],
authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer,
parser_classes=(FormParser, MultiPartParser,)
)
def upload_avatar(self, request, pk=None, *args, **kwargs):
if 'POST' in request._method or 'PATCH' in request._method:
# Write code to save the file??
else:
multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk)
page = self.paginate_queryset(multimedia)
serializer = self.get_pagination_serializer(page)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
我的模特:
class Women(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
avatar = …Run Code Online (Sandbox Code Playgroud)