前提・実現したいこと
コメントフォーム。コメントの表示。いいねボタンを一覧にしてwebアプリケーションを制作しています。
いいねボタンを押した後のurlでformを送信するとtextが残存してしまいます。
どのような意味かと申しますと、
現在このようなurls.pyの構成になっており
python
1 path('', views.FormAndListView.as_view(), name='board'), 2 path('good/<int:pk>', views.good, name='good'), 3 path('good/<int:next>/', views.index, name='index'), 4
path('', views.FormAndListView.as_view(), name='board'),で表示されるboard.htmlはこのようになっております。
{% extends 'board/base.html' %} {% block content %} {% load static %} <link rel="stylesheet" type="text/css" href="{% static 'board/style.css' %}"> <div class="alert alert-primary" role="alert"> <strong><p class="w-normal"><a href="http://localhost:8000/polls/">現在投票中のアンケート一覧{% for questions in question %}{% if questions.is_date_limit %}<li>{{ questions.question_text }}{% endif %}{% endfor %}</li></a></p></strong> </div> <div class="mb-5"> <div class="ml-md-2"> <form action="" method="POST" enctype="multipart/form-data"> {{ form.as_p }} <button type="submit">送信</button> {% csrf_token %} </form> </div> </div> {% for post in post_list %} <div class="alert alert-success" role="alert"><p class="w-normal"><strong>{{ post.name }}</strong> さん</p></div> <div class="mb-2"> <div class="ml-md-2"> <p class="w-normal">{{ post.text | linebreaksbr }}</p> </div> {% if post.file %} <p><img src="{{ post.file.url }}"></p> {% endif %} <div id="{{ post.pk }}" class="ml-md-2"> <p>{{ post.date }}</p> <form action="{% url 'board:good' post.pk %}" method="post"> {% csrf_token %} <input type="submit" name="good" value="いいね">({{ post.good }} いいね) </form> </div> {% endfor %} <script> {% if next %} window.location.href += '#{{ next }}'; {% endif %} </script> </div> {% endblock %}
この部分にいいねボタンを作り、ボタンを押すと数字がひとつ増えるように関数を作りました。
<form action="{% url 'board:good' post.pk %}" method="post"> {% csrf_token %} <input type="submit" name="good" value="いいね">({{ post.good }} いいね) </form>
def good(request, pk): """いいねボタンをクリック.""" post = get_object_or_404(Post, pk=pk) if request.method == 'POST': # データの新規追加 post.good += 1 post.save() return redirect('board:index', next=pk)
さらにそこから先ほどいいねボタンを押した場所(一覧ページの途中)に遷移できるように以下のコードを作りました。
def index(request, next=None): form = PostForm(request.POST or None) question = Question.objects.all() post_list = Post.objects.order_by('-date') context = { 'next': next, 'question': question, 'post_list': post_list, 'form': form, } if request.method == 'POST' and form.is_valid(): form.save() return render(request, 'board/board.html', context)
これでいいねボタンを押すとboard.htmlの
<div id="{{ post.pk }}" class="ml-md-2">
に
遷移するようになったのですがひとつ問題が発生してしまいました。
それは遷移した
path('good/<int:next>/', views.index, name='index'),
のページでPostFormを使ってコメントの投稿をすると投稿は出来るのですがフォームの内容が残存してしまうのです。
models.pyは
from django.db import models from django.utils import timezone class Post(models.Model): class Meta: verbose_name = '投稿' verbose_name_plural = '投稿リスト' name = models.CharField('名前', max_length=20, default='ベルマーレ大好き') text = models.TextField('本文') date = models.DateTimeField('日付', default=timezone.now) file = models.FileField('ファイル', null=True,) good = models.IntegerField(default=0) def __str__(self): return self.text
forms.pyは
from django import forms from django.views import generic from .models import Post class PostForm(forms.ModelForm): file = forms.FileField(required=False) #fileアップロード部分のラベルを消去 file = forms.FileField( label='', required=False, ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' class Meta: model = Post fields = ('name', 'text', 'file')
このようになっており。nameは残しつつ、textとfileは投稿するとデータが消去されるようにしたいです。
if request.method == 'POST' and form.is_valid(): form.save() return render(request, 'board/board.html', context)
本来はこのようにせずにredirectでboardに遷移させればよいのですがそれをするといいねボタンを押したときにページの一番上に遷移してしまうのでどのような手を打てば良いか悩んでおります。
もしよければアドバイスをお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージはありませんがページをrenderで移動した際にフォームの内容が残ってしまう。
試したこと
def index(request, next=None): form = PostForm(request.POST or None) question = Question.objects.all() post_list = Post.objects.order_by('-date') context = { 'next': next, 'question': question, 'post_list': post_list, 'form': form, } if request.method == 'POST' and form.is_valid(): form.save() return render(request, 'board/board.html', context)
form.saveのあとに
form.delete
と加えてみましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
python=3.7.0
django=(2, 0, 2, 'final', 0)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/01 04:57
2019/02/01 05:03
2019/02/01 05:11
2019/02/01 05:16
2019/02/01 05:25
2019/02/01 05:36
2019/02/01 05:51