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
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/27 08:51 編集
2018/11/27 10:17
2018/11/27 12:13 編集
2018/11/27 12:35
2018/11/28 08:17 編集
2018/11/28 12:43
2018/11/29 04:57
2018/11/29 12:44