comment.html

Python

どの記事に対するコメントかわかるように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