私は 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 に基づいています。
だから、誰かが彼の意見を言うことができれば、私はとても感謝しています!
前もって感謝します!