ACHO.pk devlog

[멋쟁이사저처럼10기] Django 블로그 만들기(댓글 구현) 본문

멋쟁이사자처럼

[멋쟁이사저처럼10기] Django 블로그 만들기(댓글 구현)

Acho 2022. 7. 7. 23:35

 

블로그 게시글 댓글 구현

 

models.py

class Comment(models.Model):
    comment = models.CharField(max_length=200)
    date = models.DateTimeField(auto_new_add=True)
    #어떤 게시물에 달린 댓글인지 알 수 있는 게시글이 쓰임
    post = models.ForeignKey(Blog, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.comment
post = models.ForeignKey(Blog, on_delete=models.CASCADE)
  • post는 Blog 객체를 참조해서 만든다.(외래키)
  • post가 참조하고 있는 게시글이 삭제된다면, post도 삭제된다.

 

변경사항이 담긴 파일을 만들어준 후,
python manage.py makemigrations

이 파일을 데이터 베이스에 반영해주면 된다.

python manage.py migrate

 

comment 객체를 admin 페이지에서 관리할 수 있도록 admin.py 에등록을 해주자.

from django.contrib import admin
from .models import Blog, Comment

admin.site.register(Blog)
admin.site.register(Comment)

댓글 달기

 

댓글이 달린 걸 확인할 수 있음


HTML 상에 댓글 창 띄우기

 

forms.py

from .models import Blog, Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['comment']

 

views.py

from .forms import CommentForm

def detail(request, blog_id):
    # blog_id 번째 블로그 글을 데이터베이스로부터 갖고와서
    blog_detail = get_object_or_404(Blog, pk=blog_id)
    #Blog에 해당하는 객체를 가져오는데, pk 값이 blog_id인 객체를 가져와라
    # detail.html로 띄워주는 코드
    comment_form = CommentForm()
    return render(request, 'detail.html', {'blog_detail': blog_detail
                  , 'comment_form':comment_form})


def create_comment(request, blog_id):
    filled_form = CommentForm(request.POST)
    
    if filled_form.is_valid():
        #저장하기 전에 대기
        finished_form = filled_form.save(commit=False)
        finished_form.post = get_object_or_404(Blog, pk=blog_id)
        finished_form.save()
        
    return redirect('detail', blog_id)

 

detail.html

<h3>댓글</h3>
<form method="POST" action="{% url 'create_comment' blog_detail.id %}">
    {% csrf_token %}
    {{ comment_form }}
    <input type = "submit">
</form>

 

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
      
    #댓글 저장
    path('create_comment/<int:blog_id>', views.create_comment, name='create_comment')  
]

댓글 목록 띄우기 

 

detail.html

<!-- 댓글 목록 -->
{% for comment in blog_detail.comment_set.all %}
    <P>{{ comment }}</P>
    <hr>
{% endfor %}

 

Comments