2

現在、Google Cloud SQL を使用してアプリ エンジンでホストしているアプリケーションでのデフォルトの Django FileField アップロード メソッドは、次のエラーを返します。

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

これはおそらく、アプリ エンジンでファイルの書き込みが制限されており、Django デバッグ モードで mkdir が機能しないことが原因です。

/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 で同じエラーが発生します。

ジャンゴのセットアップ:

モデル

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 に答える