##【行いたいこと】
投稿プレビュー画面(モデルに保存前、フォームからテンプレートに渡している状態から)で画像を表示
「戻る」を押した際に、フォームの中にファイルを保持した状態で、編集ページに戻る
「投稿」を押した際に、モデルに画像ファイルを保存
##【問題】
モデルに保存していない状態で、フォーム上の画像を表示ができていない。
form.field.as_hiddenとして、「戻る」「投稿」を押した際にデータの送信を行っているおり、as_hiddenでは画像ファイルの送信が行えない。(この点は、自分の解釈と、ネット上の情報を参照しました。)
##【試したこと】
下記のようにして、画像の表示を試みましたが、前者はsrc="filename.jpg"
のようになり、後者はsrc="unknown"となりました。<img src="{{ form.file.value }}">
<img src="{{ form.file.url }}">
アドミンサイトからの画像の登録、プレビューページ上でas_hiddenを外し、プレビューページ上で再度画像の登録を行った場合は、どちらも問題なく動作しています。
##【該当コード】
forms.py
python:forms.py
1class PostForm(forms.ModelForm): 2 class Meta: 3 model = Post 4 fields = ('title', 'text', 'file')
models.py
python:models.py
1class Post(models.Model): 2 author = models.ForeignKey(settings.AUTH_USER_MODEL, 3 on_delete=models.CASCADE) 4 file = models.ImageField(upload_to='media',blank=True, null=True) 5 title = models.CharField(max_length=200) 6 text = MarkdownxField('text') 7 created_date = models.DateTimeField(default=timezone.now) 8 published_date = models.DateTimeField(auto_now=True)
views.py 下記は、d_new_postで編集し、new_previewでプレビューし、
戻る場合はPOSTリクエストにてd_new_post、確定した場合、d_post_detailに進みます。
django:views.py
1def d_post_detail(request, pk): 2 title = 'Post Detail' 3 user = request.user 4 if request.method == 'POST': 5 form = PostForm(request.POST) 6 if form.is_valid(): 7 post = form.save(commit=False) 8 post.author = user 9 post.file = request.FILES['file'] 10 post.published_date = timezone.now() 11 post.save() 12 else: 13 post = get_object_or_404(Post, pk=pk) 14 return render(request, 'dashboard/post_detail.html', {'post': post, 'user': user, 'title':title}) 15 16def d_new_post(request, pk): 17 title = 'New Post' 18 if request.method == 'POST': 19 form = PostForm(request.POST, request.FILES) 20 form.file = request.FILES['file'] 21 else: 22 form = PostForm() 23 return render(request, 'dashboard/post_new.html', {'form': form, 'pk': pk, 'title': title}) 24 25 26def new_preview(request, pk): 27 title = 'New Post Preview' 28 form = PostForm(request.POST, request.FILES) 29 form.file = request.FILES['file'] 30 return render(request, 'dashboard/new_preview.html', {'pk': pk, 'form': form, 'title': title})
preview.html
html:preview.html
1 {% if form.file %} 2 <img src="{{ form.file.value }}"> 3 {% endif %} 4 {{ form.text.value | markdown_to_html }} 5 </div> 6 </div> 7 <div class="card-footer"> 8 <form action="{% url 'account:d_new_post' pk %}" method="POST" enctype="multipart/form-data"> 9 {% csrf_token %} 10 {% for field in form %} 11 {{ field.as_hidden }} 12 {% endfor %} 13 <button type='submit' class="btn btn-primary float-left"><b>Back to Edit</b></button> 14 </form> 15 <form action="{% url 'account:d_post_detail' pk %}" method='POST' enctype="multipart/form-data"> 16 {% csrf_token %} 17 {% for field in form %} 18 {{ field.as_hidden }} 19 {% endfor %} 20 <button type='submit' class="btn btn-default float-right"><b> Confirm </b></button> 21 </form>
あなたの回答
tips
プレビュー