私はDjangoを使用していて、画像のアップロードでかなり一般的な機能を実装しようとしています。formset
ユーザーがアップロードしたばかりの各画像にキャプションを追加するための(多分?)を生成したい( modelformset
「アップロードしたばかりの画像を確認する」ページに似ています)。
これが基本的な考え方です。
1つまたは複数の画像を一度に送信するための簡単なフォームがあります。
class UploadImageForm(forms.Form):
images = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': 'multiple'}))
これを生成します:
次に、ビューで、POSTからの各画像に対して処理/処理を行い、サイズ変更されたバージョンの画像をモデルのインスタンスとして保存します。これは次のように呼ばれImageItem
ます。
class ImageItem(models.Model):
resized_img = models.ImageField(upload_to=img_get_file_path)
user = models.ForeignKey(User)
upload_date = models.DateTimeField(auto_now_add=True)
last_modified = models.DateTimeField(auto_now=True)
caption = models.CharField(max_length=1000,
blank=True)
(UploadImage
参照用のビューは次のとおりです...フォームが検証され、画像がhandle_uploaded_image関数に保存されるとすぐに、すべての画像にキャプションを追加するためのビューにリダイレクトされることに注意してください。)
def UploadImageToLibrary(request):
if request.method == 'POST':
form = UploadImageForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_image(form) # creates new sizes of images, saves resized version as ImageItem instances
return AddInfoForImage(request) # SEND USER TO A PAGE FOR ADDING CAPTIONS TO EACH IMAGE...not sure what this next view should contain...?
else:
form = UploadImageForm()
return render_to_response('upload_item.html', {'form': form}, context_instance=RequestContext(request))
さて、今私が助けを必要としている部分が来ます...
画像が保存されたらすぐに、次のビューでアップロードされた画像ごとにフォームを生成して、ユーザーが画像にキャプションを追加できるようにします。すべての新しい画像にすべての情報を追加し終えたら、をsubmit
押して、各キャプションを適切なImageItemインスタンスに保存します。ユーザーがアップロードした画像の数に応じて、作成するフォームの数がわかりません。以下は、フォームセットに実行させたいことを視覚的に表したものです(他のものは無視して、例として簡単なキャプションを引き続き使用できます)。
具体的には、これは私が助けを必要としているものです:
CaptionForm
ユーザーがアップロードしたばかりの画像の数に基づいて、適切な量のsを提供する方法がわかりません。ImageItem.resized_img
テンプレートで参照しているフォームの左側に適切なものを配置する方法がわかりません。CaptionForm
が送信されたら、キャプションを適切なImageItem
インスタンスに保存する方法がわかりません。
これらの3つのポイントすべてが、1つformset
またはmodelformset
ソリューションで何らかの形で対処できると思いますか?
私が言ったように、これは非常に一般的な状況のようです。これを行う既存のコードを誰かが知っている場合は、私に知らせてください。ありがとう!