2

django で画像をアップロードする方法がわかりません。ここで何十ものブログ投稿と質問を読みましたが、それらのほとんどは私をさらに混乱させるだけです.

これが私がこれまでに持っているものです。これは私のモデルです:

 class Post(models.Model):
  user = models.ForeignKey(User)
  screenshot = models.ImageField(null=True, upload_to="images")
  date = models.DateTimeField("date posted", auto_now=True)
  text = models.TextField()

私が使用するフォームは次のとおりです。

 class PostForm(forms.Form):
   text = forms.CharField(
      widget = forms.Textarea(attrs = {'cols': 40, 'rows': 10}), required=True)
   screenshot = forms.ImageField(required=False)

そして、現在フォームを処理する方法は次のとおりです。

  if request.method == 'POST':
    form = PostForm(request.POST, request.FILES)
    if form.is_valid():
      post = Post(
        user = request.user, 
    text=form.cleaned_data['text'], 
    screenshot=form.cleaned_data['screenshot']
      )
      post.save()

しかし、これは機能しません。ファイルはサーバーにアップロードされません。ファイルのアップロードに関するドキュメントによると、独自の handle_uploaded_file 関数を作成する必要がありますが、そのページには説明がありません:

  • アップロードしたファイルの保存場所を確認するにはどうすればよいですか?
  • ファイルを複数のディレクトリに分散するにはどうすればよいですか?
  • 同じ名前の 2 つのファイルが互いに上書きされないようにするにはどうすればよいですか?
  • モデルの ImageField に割り当てる値は何ですか?

それらの問題はすでに千回解決されているようです...

4

2 に答える 2

5

1)パスImageFieldが必要です:upload_to

models.ImageField(required=False, upload_to="/relative/path/to/foo/bar")

IIRC、これは MEDIA_ROOT に相対的であることに注意してください

2)それらをディレクトリに分散するには、設定upload_to=my_path_naming_methodして実行するだけです

def my_path_naming_method(instance, filename):
  #something here that returns a new/bespoke string path for each file or similar

3) 2 つのファイルが同じ名前の場合、Django は新しいファイルに_接尾辞を付けます。たとえばfoo.jpg、「foo_.jpg」と名前が衝突することはありません

4) 意味がわかりませんが、うまくいけば 1 ~ 3 でうまくいきます。

于 2010-07-27T22:17:04.530 に答える
-3

最終的に、私のコードは正しかったのですが、Django のバージョンが間違っていたことが判明しました。Django 1.2.1 (1.0.2 から) にアップグレードした後、私のコードは変更されずに動作しました。

自分の質問に答えるために

  • 画像は、settings.py で指定された MEDIA_ROOT に関連して、指定した upload_to dir にアップロードされます。
  • これについてはまだわかりません
  • Django は重複を防ぐためにファイル名にアンダースコアを自動的に追加します
  • screenshot=form.cleaned_data['screenshot']上記のコードのように割り当てると、期待どおりに機能します。
于 2010-08-09T09:17:41.967 に答える