【问题标题】:Image upload directive (angularJs and django rest framework)图片上传指令(angularJs 和 django rest 框架)
【发布时间】:2014-03-15 21:56:32
【问题描述】:

我需要一个图片上传指令,我的代码如下所示:

# Model
class transporter(models.Model):
    company_name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    image = models.FileField(upload_to=upload_path,blank=True, null=True)

    def upload_path(self, filename):
        return 'photos/%s/%s' % (self.company_name, filename)


# Serializer
class transporterSerializer (serializers.HyperlinkedModelSerializer):
    username = serializers.Field(source='username.username')

    class Meta:
        model = transporter
        fields = ('id','company_name','address','image')

它仅适用于 django rest 框架,但如果我使用 angularjs 发布传输器模型,我会收到错误请求错误。我需要上传图像并使用图像 URL 设置图像字段。谢谢你

【问题讨论】:

标签: django angularjs-directive image-uploading django-rest-framework


【解决方案1】:

我将分享我使用 Angular 和 drf 上传文件的经验。

第 1 步:
将文件输入绑定到角度模型时使用文件模型指令。我在几个项目中使用下面的一个,这对我有用。我是从 Jenny Louthan 的 this blogpost 那里得到的。

angular.module('appName').directive('fileModel', ['$parse', function ($parse) {
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]);
            });
        });
    }
};
}]);

用于文件输入:

<form enctype="multipart/form-data">
    ...
    <input type="file" class="form-control" file-model="transporter.image">

第 2 步:
在处理帖子的控制器或服务中创建一个 formData 对象。这可以通过首先启动一个新的 formData 对象来完成。然后遍历您的角度对象并将其所有属性设置为该 formData 对象。

如果在控制器中完成,可以这样完成:
(我在 _.each 循环中使用了 lodash,但可以选择适合您的方式)

var fd = new FormData();
_.each($scope.transporter, function (val, key) {
    fd.append(key, data[key]);
});

第 3 步:
使用 angulars $http 将 formData 对象发布到您的 url 端点并随意处理成功请求!

$http({
    method: 'POST',
    url: '/api/url/to/endpoint',
    data: fd,
    transformRequest: angular.identity,
    headers: {
        'Content-Type': undefined
    }
}).success(function (response) {
    // Do stuff with you response
});

【讨论】:

  • 在步骤 2 中,在您的 _.each() 循环中,您有一个名为 data 的数组。这个是从哪里来的?当我尝试这个循环时,我收到一条错误消息,提示 data 未定义...
  • @Vince 这里的“数据”将是原始对象。例如,在上面的示例中,模板将对象“transporter”绑定到范围,在这种情况下,控制器中的“数据”将引用“transporter”对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2016-05-02
  • 2018-08-17
  • 2017-07-26
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多