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

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

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

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

Python

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

Q&A

解決済

1回答

420閲覧

<django>投票にコメントを紐つけて表示させたい

sr2460

総合スコア50

Django

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

Python

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

0グッド

0クリップ

投稿2018/11/27 06:39

編集2018/11/27 07:03

python=3.7.0
django=(2, 0, 2, 'final', 0)

の環境で開発しています。
まず投票をし、(urlはhttp://127.0.0.1:8000/polls/6/)
イメージ説明

投票結果を表示(urlはhttp://127.0.0.1:8000/polls/6/results/)
イメージ説明

さらにその質問に対してコメントを投稿(urlはhttp://127.0.0.1:8000/polls/add/6/)
イメージ説明

しかしここでエラーが出てしまいます。(urlはhttp://127.0.0.1:8000/polls/add/6/ のまま)
イメージ説明

本当はここからコメントページにデータが送られ、この質問に関するコメントを一覧にしようと思っているのですがうまくいきません。
コマンドプロンプトに

return Database.Cursor.execute(self, query, params) django.db.utils.OperationalError: table polls_comment has no column named questi on_id

とエラーが出ているのでidをうまく受け渡せていないのだと思うのですが・・・。

コメントページのフォームはviews.py

def add(request, question_id): #urlのpkを基に、Commentを取得 day = get_object_or_404(Question, pk=question_id) #フォームに取得したCommentを紐つける form = CommentForm(request.POST or None) # method = POST、つまり送信ボタン押下時、入力内容に問題なければ if request.method == 'POST' and form.is_valid(): form.save() return redirect('polls:comment') #通常時のページアクセスや、入力内容に誤りがあればまたページを表示 context = { 'form':form } return render(request, 'polls/day_form.html', context)

urls.py

path('add/<int:question_id>/', views.add, name='add'),

forms.pyに

from django import forms from .models import Comment class CommentForm(forms.ModelForm): class Meta: model = Comment fields = '__all__'

models.pyに

class Comment(models.Model): title = models.TextField('コメント') question = models.ForeignKey(Question, verbose_name='紐づく質問', on_delete=models.PROTECT) def __str__(self): return self.text[:10]

のように作成してあります。
ここから

path('comment/int:post_pk', views.CommentView.as_view, name='comment'),
でcomment/int:post_pkというurlで質問ごとにコメントを受渡し、

from django.urls import path from .import views app_name = 'polls' urlpatterns = [ path('', views.IndexView.as_view(), name='view'), path('<int:pk>/', views.DetailView.as_view(), name='detail'), path('<int:pk>/results/', views.ResultsView.as_view(), name='results'), path('<int:question_id>/vote/', views.vote, name='vote'), path('add/<int:question_id>/', views.add, name='add'), path('comment/<int:post_pk>', views.CommentView.as_view, name='comment'), ]

そのためにview.pyでは

class CommentView(generic.CreateView): model = Comment form_class = CommentForm def comment(self, form): post_pk = self.kwargs['post_pk'] comment = form.save(commit=False) comment.post = get_object_or_404(POST, pk=post_pk) comment.save() return redirect('polls:comment', pk=post_pk)

と記載。これでおそらくpost_pkが受け渡されコメントページに飛ぶと思うのですが・・・。

ちなみにデータを集積する予定のcomment_list.htmlには以下のように記載されています。

{% extends 'polls/base.html '%} {% block content %} {% for comment in comment_list %} <h2>{{ comment.title }}</h2> {% endfor %} {% endblock %}

githubにコードを記載しました。
https://github.com/sr2460/polls2

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

フォーム送信時に出ているエラー文 ↓ は、データベースのテーブル polls_commentquestion_id というカラムが存在しませんよ、と言っています。

text

1django.db.utils.OperationalError: table polls_comment has no column named question_id

model Comment の定義がご提示されたコードのとおりで migrate 処理も済ませてらっしゃるのであれば、本来なら question_id カラムが存在するはずです。カラムが存在するかどうか確認してみてください。もし存在しなくて migrate がまだの場合は適宜 makemigrationsmigrate を実行すると解決するものと思います。

...

以下その他のポイントについてのコメントです。

  • コメントの「表示」の課題の前に、まずコメントのフォームを完成させるところに集中されるのがよいかと思います。
  • 「紐づく質問」をユーザに選択させたい場合はこのままでよいですが、「紐づく質問」を URL にあわせて自動的にセットされたい(ユーザに選択させたくない)場合は、 CommentForm.Meta.fields で対象フィールドを制限されて、フォームクラスか view の方でセットするようにするとよいでしょう。
  • CommentViewcomment() メソッドを定義されていますが、これは一見どこからも呼ばれないように見えます。期待されたタイミングで呼ばれているかどうかご確認されてみてください。

ご参考になさってください :)

投稿2018/11/27 07:00

編集2018/11/27 07:01
gh640

総合スコア1407

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

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

sr2460

2018/11/27 08:51 編集

素早いご連絡ありがとうございます。 migrationsに関しては $py manage.py makemigrations polls No changes detected in app 'polls' $py manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying polls.0004_comment_question...Traceback (most recent call last): File "manage.py", line 15, in <module> execute_from_command_line(sys.argv) (中略) ValueError: invalid literal for int() with base 10: 'japan' のように表示され、エラーだとは思うのですが解決方法が分からなかった+コードの問題かもしれない、のでとりあえず後回しにしておりました。 またフォームに関してなのですが、 class CommentForm(forms.ModelForm): class Meta: model = Comment fields = '__all__' のfields部分を fields=__title__もしくはfields=('title') あたりで制限をかけられると思ったのですが、 TypeError: CommentForm.Meta.fields cannot be a string. Did you mean to type: ('_ _title__',)? のようにコマンドプロンプトでエラーが出てしまうためこれも後回しにしておりました。 CommentView に comment() メソッドに関してはまだ私も理解が及んでおらずいろいろ試行錯誤しております。 漠然とですがうまくプライマリーキーが受け渡せていない気はしています。
gh640

2018/11/27 10:17

なるほど。課題がいくつかあるようですね。ここですべての課題をご解決まで持っていくのは大変な気がしますので、可能な範囲で回答させてください。 > migrationsに関しては こちらは `django.db.utils.OperationalError` のエラーの直接の原因になっているものと思います。 model の変更後に migrate を正しく済ませていないと model 定義とデータベーススキーマに不整合が起こり今回のようなエラーが発生してしまいます。まずはこの問題を最優先で解決する必要があるかと思います。 具体的には migration ファイル `0004_comment_question...` の中身が間違っているようですので、それを修正する必要があります。 `0004_` には現在の model 定義とは異なる内容が入っているような感じがしますので、私ならいったん `0004_` ファイルを削除して `makemigrations` を実行し直しますが、万が一おかしな状態になると問題が深刻化するので、 sr2460 さんにとって解決しやすい形を模索してみてください。どうしても難しい場合は、その中身を質問欄に追記いただき重ねてご質問いただくか、別の質問を立ち上げてください。 > またフォームに関してなのですが、 これはエラーメッセージの説明のとおり、 `fields = ('title',)` と記述すれば解決するのではないかと思います。値 `('title',)` は `tuple` であり、 `('title')` ( `str` )とは意味が異なるのでご注意ください。公式ドキュメントの次のページがご参考になります。 - https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#selecting-the-fields-to-use > CommentView に comment() メソッドに関してはまだ私も理解が及んでおらずいろいろ試行錯誤しております。 こちらは今後の課題ですね。上のいくつかのエラーが解決した後に取り組むのがよいかと思います。いくつかのエラーが解消すればゴールは遠くは無いと思います :)
sr2460

2018/11/27 12:13 編集

migrationの状態を探ったところこのようになっておりました。 admin [X] 0001_initial [X] 0002_logentry_remove_auto_add auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages [X] 0008_alter_user_username_max_length [X] 0009_alter_user_last_name_max_length contenttypes [X] 0001_initial [X] 0002_remove_content_type_name polls [X] 0001_initial [X] 0002_auto_20181123_1720 [X] 0003_auto_20181123_2242 [ ] 0004_comment_question sessions [X] 0001_initial 削除の方法が分からなかったのでこちらを参考にしたところ https://qiita.com/ajitama/items/130b2f31abd855937a93 polls [X] 0001_initial [X] 0002_auto_20181123_1720 [X] 0003_auto_20181123_2242 [X] 0004_comment_question このような状態になりました。いったんはここからうまくいくかどうか試行錯誤してみます。 またわからないことが出てくると思いますので、頑張ってみてどうしてもうまくいかなけば質問させてください! ありがとうございます! (本当は解決済みにしたいのですがもう少しこのままの状態にさせていただけると幸いです)
gh640

2018/11/27 12:35

> polls > [X] 0001_initial > [X] 0002_auto_20181123_1720 > [X] 0003_auto_20181123_2242 > [X] 0004_comment_question > > このような状態になりました。 そうなんですね。一度お試しになっていただければと思いますが、もしデータベーステーブル `polls_comment` に `question_id` がなければ、別のエラーが出てしまうかもしれません。 重要なのは model とデータベーステーブルのスキーマが整合していることです。もしかしたら今からもう一度 `makemigrations` → `migrate` をしていただくと解決するような気もしますが、まずは一度がんばってみてください :)
sr2460

2018/11/28 08:17 編集

お世話になります。その後再度 makemigrationをしたところ No changes detected in app 'polls' となりました。 変更した部分がない場合に子の表記が出たと記憶しているのですがとりあえず再度 py manage.py migrate と打ち込んだところ Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: No migrations to apply. と表記がされました。とりあえずmigarationsに関してはやりようがないので次に `fields = ('title',)`の問題に着手しました。 こちらはすぐに解決しました。ありがとうございます! その後CommentView に comment() の方の問題に取り掛かりいろいろ試行錯誤しましたが現在のところ解決には至っておりません。 そこで感じたのですがエラー django.db.utils.OperationalError: table polls_comment has no column named questi on_id のpolls_commentがどこにあるか理解していないと感じました。 polls_comment.pyというファイルがあるわけではありませんし、views.pyに存在する def comment(self, form): に関しても違うのかなと感じました。(関数の名前を変えたり(self, form, question_id)と書き加えてもエラーの内容が変わらなかったためです) データベースというものもきちんと理解していないのですがsettiings.pyをいじればいいのかなと思いましたがどう変更してよいかは調べましたがよくわかりませんでした。 とりあえずまずpolls_commentというのが何を指すのかわかっていないと思いましたので、それがどのファイルを指すのかご教示いただけると幸いです。 (今私が作っているアプリケーションもdjangoチュートリアルの投票アプリにudemyの講座で習ったブログのコメント挿入機能を追加しているというだけなので基礎的なことが分かっていないと思うのですが、良ければよろしくお願いいたします。)
gh640

2018/11/28 12:43

ひとまず `polls_comment` のポイントだけお答えさせていただきますね。 回答欄でも「データベースのテーブル `polls_comment` 」と述べていますが、 `polls_comment` というのはお使いの Django プロジェクトで利用されているデータベースのテーブルの名前です。 Django チュートリアルのプロジェクトをそのままお使いになっているのであればデータベースはおそらく SQLite ではないかと思いますが、テーブルはそのデータベースの中にあり、 model 等のデータを格納する場所です。 そのデータベースのテーブルのひとつとして `polls_comment` というものが作られているはずなので、その構造を確認してみてください、という意味でした。 確認方法はお使いのデータベースによって異なりますし、ググっていただくとすぐに見つかりますので、一度検索してみてください :)
sr2460

2018/11/29 04:57

すみません。完全に詰まってしまい解決の糸口が見えないので違う方向性でもう一度アプローチしてみようと思います。 一度解決済みにしてしまいます。 本当にありがとうございます!
gh640

2018/11/29 12:44

ご丁寧にご状況お知らせくださりありがとうございます。ひとつの問題を解決しようとすると別の問題が出てきたりして、大変ですよね。がんばってください :D
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問