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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

3043閲覧

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

sr2460

総合スコア50

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/02/01 02:52

前提・実現したいこと

コメントフォーム。コメントの表示。いいねボタンを一覧にして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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2019/02/01 04:31

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sr2460

2019/02/01 04:57

お返事ありがとうございます。 java scriptに関してはこのコードでも使っておりますが学習したことは無いのです。ただ調べているとjava scriptの領域なのかなとは認識しております。 この処理を行うには体系的に学習しなくてはいけなそうなので少し時間をかけないといけないかなとは感じております。
m.ts10806

2019/02/01 05:03

細かいですがそこに半角スペース入れるとおかしいことになることがありますのでご注意を。 もちろん私は「Webで」という範囲の観点から「これが良さそう」という提案をしていますので、「絶対にこれしかない(JavaScriptの範疇でしかない)」という話をすすめているわけでもないです。 あくまでやり方の1つとしてとらえていただけたらと。 ただ、Webをやっていく以上は必須の技術でもありますし(djangoってWeb構築のフレームワークですよね?)、覚えることでできることが一気に広がるので、多少時間をかけてでも覚えていったほうが今後のためにはなるのではと思います。 特に「いいね」機能とか有名無名限らず非同期通信であるAjaxを利用するのが通例です。毎回サーバー送信で画面遷移から・・となると利用者もストレスになりますしね。 ご検討ください。
sr2460

2019/02/01 05:11

JavaScriptということですね。ありがとうございます! 以前はそうでもなかったのですがdjangoでwebアプリケーションの開発をしていて、JavaScriptでできそうだなと思う場面が増えてきていたので、やってみようかなと思っていたところではあったんです。 色々な学習もしつつJavaScriptの学習も検討してみます! 解決済みを押したいところなのですが少しこのままにさせておいてください。 時間はかかるかもしれませんが自己解決できるかもしれませんですし。
m.ts10806

2019/02/01 05:16

いえ、「解決した気がする」「コピペコードもらったから終わり!」だけだと回答者もモヤッとした感じが残りますので、その心意気は非常に大事と思います。 私も「ヒントになればいいかな」くらいで回答をしています。(自分勝手な自己解決でなければ大歓迎です)
sr2460

2019/02/01 05:25

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

2019/02/01 05:36

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

2019/02/01 05:51

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

0

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

投稿2019/02/01 03:05

arcrista_qg

総合スコア70

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sr2460

2019/02/01 04:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問