comment.html
どの記事に対するコメントかわかるようにtargetフィールドを作成する
auto_now=Trueはインスタンス作成時の時刻が保存される
入力欄の前の表記を英語から日本語にしたければ、
CASCADEの後に, verbose_name=’対象記事’を書くこと
また、def __str__(self):は、管理画面に表示されるレコードを判別する文字列
models.py |
class Comment(models.Model): name = models.CharField(‘名前’, max_length=50, default=’名無し’) text = models.TextField(‘本文’) created_datetime = models.DateTimeField(auto_now=True) target = models.ForeignKey(App, on_delete=models.CASCADE) def __str__(self): return self.name |
forms.py |
from .models import Commentclass CommentForm(forms.ModelForm): class Meta: model = Comment fields = [‘name’,‘text’] |
admin.py |
from .models import Commentclass CommentAdmin(admin.ModelAdmin): list_display = (‘id’, ‘name’) list_display_link = (‘id, ‘name’)admin.site.register(Comment, CommentAdmin) |
detail/<int:pk>をdetail/<int:appid>とした場合、
Generic detail view Detail must be called with either an object pk or a slug in the URLconf.というブラウザエラーが発生する
これはurls.pyのURLでpkもしくはslugの文字列がないときに発生する
viewsのdef関数ではなくCommentクラスを使う場合は.as_view()が必要
app/urls.py |
urlpatterns = [ path(‘detail/<int:pk>’, views.Detail.as_view(), name=’detail’), path(‘comment/<int:pk>’, views.CommentCreate.as_view(), name=’comment’),] |
get_context_dataメソッドはテンプレートファイル(※1)に任意のcontextを返す関数
※1:templatesフォルダ内のHTMLファイルのこと
model=Appとしたのでdetail.htmlで{{app.title}}などが使えるようになった
context[‘app’]=get_object_or_404(App, id=appid)は書く必要がない
書くと、name ‘appid’ is not defined というブラウザエラーが発生する
views.py |
from django.views import genericfrom .models import App, Commentfrom .forms import CommentForm class Detail(generic.ListView): model = App template_name = ‘app/detail.html’ def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context[‘comment_form’] = CommentForm return context class CommentCreate(generic.CreateView): model = Comment form_class = CommentForm def form_valid(self, form): comment = form.save(commit=False) comment.target = get_object_or_404(App, pk=self.kwargs.get(‘pk’)) comment.save() return redirect(‘app:detail’, appid=self.kwargs.get(‘pk’)) |
①appをpostにするとブラウザエラーはないけれど何もコメントが表示されない
detail.html |
{% for comment in app.comment_set.all %}① {{ comment.text }}{% endfor %} <form method=”POST” action=”{% url ‘app:comment_create’ app.pk %}”> {% csrf_token %} {{ comment_form }} <button type=”submit”>送信</button></form> |
引用文献:
コメント欄と記事詳細ページを一緒にしたいなら①、別にしたいなら②を参照すること
①https://qlitre-weblog.com/django-create-comment-same-page/
②https://chuna.tech/blog/web-application/Django/add-comment-to-blogapp/
BACK