33071


ファイルアップロードを伴うフォームの作成において、サーバサイド側でのバリデーション後に確認画面での表示をしようとしています。  
入力された内容は{{ form.hidden }}で確認画面へ渡しているのですが、その際に、アップロードしたファイルが消えてしまいます。  
こちらについて対応方法をご教示いただきたく思います。

・forms.py

[code]

    class SampleForm(forms.Form):
        image = forms.Field(
        label='画像のアップロード',
        widget = forms.FileInput())
    
[/code]

・views.py

[code]

    def form(request):
        form = SampletForm
        return render(request, 'apps/form.html', {"form":form},)
    
    def confirm(request):
        if request.method == 'POST':
            form = ContactForm(request.POST, request.FILES)
            if form.is_valid():
                return render(request,
                    'forms/contact.html',
                   {"form":form},
                )
    
    def send_email(request):
        # メール送信の処理
    
[/code]

・form.html

[code]

    <form action="{% url 'apps:confirm'%}" method="post" enctype="multipart/form-data">
        {{ form.image.label }} {{ form.image }}
        <button type="submit">入力内容を確認する</button>
    </form>
    
[/code]

・confirm.html

[code]

    {{ form.image.label }} {{ form.image.value }}
    <form action="{% url 'apps:send_email'%}" method="post" enctype="multipart/form-data">
        {{ form.hidden }}
        <button type="submit">送信する</button>
    </form>
    
[/code]

なお、confirm.htmlではアップロードしたファイル名は見える状態です。  
submitしメールを送信しても、何も添付されない状態でメールが送信されます。


CC BY-SA 3.0
2017-03-03T09:27:40.613
33067
2017-03-03T10:58:29.070
19780
question
python django
アップロードファイルが確認画面へのPOST後消えてしまう


ファイルはPOSTされた時点で一時的に保存（どこかのディレクトリにファイル保存するか、Djangoのcacheに入れるか）しておく必要があります。  
確認画面からOKで進むときに、そのキャッシュから取り出して正規の場所に置く感じです。ただしいファイルを取り出せるように一時的なキーを生成して関連づけておくとよいです。

例: <https://stackoverflow.com/questions/4630928/prompt-a-confirmation-page-
for-a-form-with-fileinput-field-in-django>

実装が面倒な場合は <https://github.com/odoku/django-formpreview>
のように提供されているコードを利用するのもありかと思います。


CC BY-SA 3.0
2017-03-03T10:58:29.070
33071
2017-03-03T10:58:29.070
2017-05-23T12:38:56.083
-1
806
33067
answer