2

目前,我们使用 Google Cloud SQL 在应用引擎上托管的应用程序的默认 Django FileField 上传方法返回以下错误:

OSError
[Errno 38] Function not implemented: '/base/data/home/apps/s~app/attachment-1.360717349796013945/media'

这可能是由于文件写入在应用程序引擎中受到限制,并且 mkdir 在 Django 调试模式下无法正常工作:

/base/python27_runtime/python27_dist/lib/python2.7/os.py in makedirs
makedirs(head, mode)
    except OSError, e:
        # be happy if someone already created the path
        if e.errno != errno.EEXIST:
            raise
    if tail == curdir:           # xxx/newdir/. exists if xxx/newdir exists
        return
mkdir(name, mode) ...

因此,我尝试安装django-filetransfer并且 Appengine 上仍然存在相同的错误。

Django 设置:

楷模

class OrderItemAttachmentForm(ModelForm):
class Meta:
    model = OrderItemAttachment
    exclude = ('item',)
def __init__(self, *args, **kwargs):
    super(OrderItemAttachmentForm, self).__init__(*args, **kwargs)

意见

def RFO(request):
    view_url = reverse('app.views.RFO')
    elif 'saveLine' in request.POST:
        order_attachment_form = OrderItemAttachmentForm(request.POST,request.FILES)
        if order_attachment_form.is_valid():
            order_attachment = order_attachment_form.save()
    upload_url, upload_data = prepare_upload(request, view_url)

模板

{% load filetransfers %}
<form id="requestItemForm" name="requestItemSubmit" method="post" enctype="multipart/form-data" action="{{ upload_url }}">{% csrf_token %}{% render_upload_data upload_data %}
<div class="lineAttach">
<label for="id_attachment">Upload Attachment</label>
{{order_attachment_form.attachment}}
</div>
<button type="submit" id="saveLine" name="saveLine" class="btn grey doLoad right" value="Save Line Item">Save Line Item</button>

我曾考虑使用Blobstore python API将文件存储为 blob 或使用 Google Cloud Storage,但不知道如何将其集成到 Django 模型中。任何帮助将不胜感激,谢谢!

4

2 回答 2

1

我有同样的麻烦。我认为 django-filetransfer 需要 djangoappengine 才能正常运行。我现在正在采取不同的方法来解决这个问题。这么方便的工具我不能用,太可惜了。

于 2012-08-13T19:35:26.987 回答
0

我知道这是很久以前发布的,但答案非常简单(尽管它并不明显):

您的 ModelForm 很好,但是您实际上可以删除该__init__函数,因为它所做的只是将详细信息传递给父类,无论如何都会发生这种情况。

您的视图需要做一些特定的事情:prepare_upload以获取正确的上传 URL,并处理 GET 和 POST 情况(一旦文件上传,Blobstore 将对您的表单执行回调。如果您使用基于类的视图,它可能看起来像这样:

class OrderAttachmentView(FormView):

    def get(self, request):
        upload_url, upload_data = prepare_upload(
            request,
            reverse('attachment-upload'),
            private=True,
            )
        form = OrderItemAttachmentForm()
        return render(
            request,
            'attachment_form.html',
            {
                'form': form,
                'upload_url': upload_url,
                'upload_data': upload_data,
            },
        )

    def post(self, request):
        form = OrderItemAttachmentForm(request.POST, request.FILES)
        order_item_attachment = form.save()
        return HttpResponseRedirect(reverse(
            'attachment-detail',
            kwargs={'pk': order_item_attachment.id},
            ))

您的表单需要自定义操作参数:

{% load filetransfers %}

<form action="{{ upload_url }}" method="POST" enctype="multipart/form-data">
    ...
    <input type="submit" value="Upload" />
</form>
于 2015-06-17T01:12:39.823 回答