0

私は GAE と Django を使用して、ユーザーが自分の画像をアップロードできるようにするアプリケーションを作成しています。また、この画像を BLOB として GAE のデータストアに保存したいと考えています。多くの例を見てきましたが、このシナリオに固有のものはありません。とはいえ、それはよくある問題だと思います。

私が望むのは、新しい製品を作成することだけであり、この新しい製品にはイメージが必要です.

最初の試み:製品のモデルに画像属性 (db.BlobProperty()) を追加しようとしましたが、明らかに django は提示されたフォームにそれを含めません。

2 回目の試行: 2 つの属性 (db.ReferenceProperty() としての製品と db.BlobProperty() としての画像) を持つ新しいエンティティを作成しました。これで、リクエストオブジェクトから画像を取得できることを期待して、django HTMLフォーム( |input type='file' name='img' /| を含む)を変更するdjangoフォームと並行して作業しようとしましたが、もう一度失敗しました。

これは製品クラスです:

class Product(db.Model):
    id = db.IntegerProperty()
    desc = db.StringProperty()
    prodCateg = db.ReferenceProperty(ProductCategory)
    price = db.FloatProperty()
    details = db.StringProperty()
    image = db.BlobProperty()

これは Django フォーム (HTML) です。

<form action="{%url admin.editProduct product.key.id%}" enctype="multipart/form-data" method="post">
<table>
{{form}}
<tr><td><input type="file" name="img" /></td></tr>
<tr><td><input type="submit" value="Create or Edit Product"></td></tr>
</table>
</form>

これは Django フォーム (python) です。

class ProductForm(djangoforms.ModelForm):
  class Meta:
    model = Product
    exclude = ['id']

これはリクエスト ハンドラです。

def editProduct(request, product_id):
  user = users.GetCurrentUser()
  #if user is None:
  #  return http.HttpResponseForbidden('You must be signed in to add or edit a gift')

  product = None
  if product_id:
    product = Product.get(db.Key.from_path(Product.kind(), int(product_id)))
    if product is None:
      return http.HttpResponseNotFound('No product exists with that key (%r)' %
                                       product)

  form = ProductForm(data=request.POST or None, instance=product)

  ##########################
  # Ambitious undertaking! #
  ##########################
  #if not product_id:
  #    uploadedImage = get("img")
  #    photo = Image()
  #    photo.product = product
  #    uploadedPhoto = request.FILES['img'].read()
  #    photo.image = db.Blob(uploadedPhoto)
  #    image.put()

  if not request.POST:
    return respond(request, user, 'addprod', {'form': form, 'product': product})

  errors = form.errors
  if not errors:
    try:
      product = form.save(commit=False)
    except ValueError, err:
      errors['__all__'] = unicode(err)
  if errors:
    return respond(request, user, 'addprod', {'form': form, 'product': product})

  product.put()

  return http.HttpResponseRedirect('/product')

ご覧のとおり、リクエスト ハンドラは Google の Gift-Tutorial に基づいています。

だから、誰かが彼の意見を言うことができれば、私はとても感謝しています!

前もって感謝します!

4

1 に答える 1

0

blobstoreuploadhandler で blobstore API を使用する例を確認したり、要求ハンドラーを編集して、blobstore API を使用するか blobproperty 変数のみを使用するかに応じて、アップロードされたファイルを blobproperty または blobreferenceproperty として保存することができます。http投稿データについて具体的にすることができます。つまり、 `

self.request.post('img').file.read() blobstore API と blobstoreuploadhandler を選択することをお勧めします。これにより、1. MIM タイプの保存と 2. ファイル名の保存 3. get_serving_url を介した提供が可能になり、いくつかの利点が得られます。

于 2011-08-25T06:44:37.370 に答える