質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

<python,django>フォームで送信した際にデータが送信フォームに残ってしまう

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 898

sr2460

score 43

前提・実現したいこと

コメントフォーム。コメントの表示。いいねボタンを一覧にしてwebアプリケーションを制作しています。

イメージ説明

いいねボタンを押した後のurlでformを送信するとtextが残存してしまいます。
どのような意味かと申しますと、

現在このようなurls.pyの構成になっており

    path('', views.FormAndListView.as_view(), name='board'),
    path('good/<int:pk>', views.good, name='good'),
    path('good/<int:next>/', views.index, name='index'),

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)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

具体的なソースが書けず恐縮ですが、投稿が完了した後の処理にフォームの内容を削除する処理を入れるのはいかがでしょうか…?
根本的な解決にはならないかも知れませんが…。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/01 13:54

    私も基本的な方向性はそれで良いような気がしていたのでform.saveの後にform.deleteを入れるだとかフィールドの中を""で空欄にできないかなど試しているのですが上手く入っていない状況です。

    キャンセル

+1

画面操作をJavaScriptで、サーバー操作をJavaScriptからAjax通して行ったら一通り解決しそうに思いますが、いかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/01 14:25

    こちらこそありがとうございます!感謝いたします!
    時間はかかるかもしれませんが経過などここで報告させていただきます。

    キャンセル

  • 2019/02/01 14:36

    もし問題が出るようであれば別質問でそこだけ質問するのもありです。
    作りの方向性自体が変わるのでここでまとめてする必要はないかなと

    キャンセル

  • 2019/02/01 14:51

    了解いたしました!!!
    そうですね。都度状況に応じて質問を立てていけば良さそうですよね。
    ただこのようにアドバイスをいただいておりますし、結果に関してはきちんとここでも報告させて頂ければいいなと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る