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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1310閲覧

Django コメントフォームにページが切り替わらない

doodai

総合スコア21

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2020/05/19 16:31

編集2020/05/19 22:47

前提・実現したいこと

掲示板アプリに返信機能を追加したい
イメージ説明
画像の返信ボタンを押すとコメントフォームに飛ぶようにしたいです。

発生している問題・エラーメッセージ

返信ボタンを押すと、画面にはHTTPエラー405と表示され、ターミナルには以下のエラーが出ます。

Method Not Allowed (POST): /comment/ Method Not Allowed: /comment/

該当のソースコード

models,views,urls,formは.pyファイル、postはhtmlファイルです。

イメージ説明

models

1from django.db import models 2from django.utils import timezone 3 4# Create your models here. 5 6class Posts(models.Model): 7 8 9 class Meta(object): 10 db_table = 'posts' 11 12 13 text = models.CharField(verbose_name='本文', max_length=255) 14 created_at = models.DateField(verbose_name='作成日', default=timezone.now) 15 16 def __str__(self): 17 return self.text, self.created_at 18 19 20class Comment(models.Model): 21 22 """コメント.""" 23 name = models.CharField(max_length=255, blank=True) 24 text = models.TextField() 25 target = models.ForeignKey(Posts, on_delete=models.CASCADE) 26 created_at = models.DateTimeField(auto_now_add=True) 27 is_publick = models.BooleanField(default=False)

views

1 2from django.shortcuts import render 3from django.shortcuts import redirect, get_object_or_404 4 5# Create your views here. 6from django.views.generic import View 7from .form import WriteForm, CommentCreateForm 8from .models import Posts, Comment 9 10 11class IndexView(View): 12 def get(self, request, *args, **kwargs): 13 queryset = Posts.objects.all().order_by('-created_at') 14 return render(request, 'posts/post.html', {'posts': queryset}) 15 16 17index = IndexView.as_view() 18 19 20class WriteView(View): 21 def get(self, request, *args, **kwargs): 22 return render(request, 'posts/write.html', {'form': WriteForm}) 23 24 def post(self, request, *args, **kwargs): 25 form = WriteForm(request.POST) 26 post = form.save(commit=False) 27 post.save() 28 return redirect(to='posts:index') 29 30 31write = WriteView.as_view() 32 33 34class CommentView(View): 35 36 37 def create_comment(request, pk): 38 form = CommentCreateForm(request.POST) 39 if form.is_valid(): 40 comment = form.save(commit=False) 41 comment.target = get_object_or_404(Posts, pk=pk) 42 comment.save() 43 return redirect(to='posts:index') 44 45 context = { 46 'posts': Posts.objects.all(), 47 'form': form, 48 } 49 return render(request, 'templates/post.html', context) 50 51comment = CommentView.as_view() 52 53

form

1from django import forms 2from .models import Posts, Comment 3 4 5class WriteForm(forms.ModelForm): 6 class Meta: 7 model = Posts 8 fields = ('text',) 9 10class CommentCreateForm(forms.ModelForm): 11 12 class Meta: 13 model = Comment 14 fields = ('text',) 15

urls

1from django.urls import path 2from . import views 3 4app_name = 'posts' 5urlpatterns = [ 6 path('', views.index, name='index'), 7 path('write/', views.write, name='write'), 8 path('comment/', views.comment, name='comment'), 9]

post

1{% extends "base.html" %} 2{% block page_title %}post{% endblock %} 3{% block title %}Posts{% endblock %} 4{% block content %} 5{% for post in posts %} 6      7<div class="post"> 8 <p class="text">{{ post.text }}</p> 9 {{ post.created_at }} 10 <hr> 11 <form method="POST" action="{% url 'posts:comment' %}"> 12 {{ comment }} 13 <button type="submit" class="button">返信</button> 14 {% csrf_token %} 15 16 </form> 17</div> 18 19{% endfor %} 20{% endblock %}

補足情報(FW/ツールのバージョンなど)

python 3.6
django 2.2
です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CommentViewで、postメソッドを実装していないからです。
Class-based viewを使用するのであれば、IndexViewはTemplateView、WriteViewとCommentViewはCreateViewから派生した方が、実装するコードも少なくて済みますよ。

投稿2020/05/20 09:48

hasami

総合スコア1277

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

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

doodai

2020/05/24 07:48

お返事が遅れて申し訳ありません。 アドバイスを参考に色々と試行錯誤した結果、先程なんとかコメントフォームを表示させることができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問