0

手動でファイルをアップロードする場合、ファイルをモデルに保存する前に最終的な場所に配置する必要がありますか? または、モデルはある時点でファイルを移動しますか? 自分で配置する必要がある場合、なぜupload_toモデル フィールドにパラメータが必要なのですか? upload_toそれは、私がそれをコピーするために使用しているパラメーターとロジックとのパリティを維持する必要があるようです。

混乱しているだけだと思います。誰かが私がこれを正しく行うのを手伝ってもらえますか?

私のフォームは、Web から画像の URL を取得します。

class ProductForm(ModelForm):    
    main_image_url = forms.URLField()
    # etc...

私のビューはそれを取得してチェックし、サムネイルを作成します。

main_img_temp = NamedTemporaryFile(delete=True)
main_img_temp.write(urllib2.urlopen(main_image_url).read())
main_img_temp.flush()

img_type = imghdr.what(main_img_temp.name)
if not img_type:
    errors = form._errors.setdefault("main_image_url", ErrorList())
    errors.append(u"Url does not point to a valid image")
    return render_to_response('add_image.html', {'form':form}, context_instance=RequestContext(request))

# build a temporary path name
filename = str(uuid.uuid4())
dirname  = os.path.dirname(main_img_temp.name)
full_size_tmp  = os.path.join(dirname, filename+'_full.jpg')
thumb_size_tmp = os.path.join(dirname, filename+'_thumb.jpg')

shutil.copy2(main_img_temp.name, full_size_tmp)
shutil.copy2(main_img_temp.name, thumb_size_tmp)

# build full size and thumbnail
im = Image.open(full_size_tmp)
im.thumbnail(full_image_size, Image.ANTIALIAS)
im.save(full_size_tmp, "JPEG")

im = Image.open(thumb_size_tmp)
im.thumbnail(thumb_image_size, Image.ANTIALIAS)
im.save(thumb_size_tmp, "JPEG")

# close to delete the original temp file
main_img_tmp.close()


### HERE'S WHERE I'M STUCK. This doesn't move the file... ####
main_image = UploadedImage(image=full_size_tmp, thumbnail=thumb_size_tmp)
main_image.save()

私のモデルには、基本的なフィールドを持つ UploadedImage モデルがあります。

class UploadedImage(models.Model):
    image = models.ImageField(upload_to='uploads/images/%Y/%m/%d/full')
    thumbnail = models.ImageField(upload_to='uploads/images/%Y/%m/%d/thumb/')
4

2 に答える 2

0

自分の質問に答えた...

モデルで ImageField にパスを渡したとき、パスを渡していました。FileDjango に組み込まれているすべてのストレージ処理を呼び出すには、オブジェクトを渡す必要があることがわかりました。upload_toこれは、パスにコピーするのに十分でした:

from django.core.files import File

main_image = UploadedImage(image=File(open(full_size_tmp)), thumbnail=File(open(thumb_size_tmp)), creator=request.user)
main_image.save()
于 2013-05-23T18:26:43.497 に答える
0

通常、モデルを保存すると、ファイルは が指す場所に書き込まれますupload_to。それ自体で処理するため、手動で行う必要はありません。

ここでは、ファイルを一時的に書き込んで、後で移動し、自動的に実行できる多くのことを行っています。彼が画像を取得してデータベースに保存するために使用するこの質問への回答を確認してください。urllib

メモリ内のバッファを渡して、サムネイルのロジックを実行するのに適したFileFieldまたはを作成できることに注意してください。また、この目的でのImageField使用を検討することもできます。django-thumbnailsいい図書館です。

お役に立てれば!

于 2013-05-23T17:59:35.710 に答える