Django 블로그의 댓글 섹션을 만드는 방법!
이 미니 튜토리얼은 각 블로그 게시물에 댓글을 추가(업데이트/삭제하지 않음)하기 위한 댓글 섹션을 만드는 데 중점을 둘 것입니다. 클래스 기반 뷰, 즉 BlogPost DetailView를 사용하는 동안 이 기능을 구현할 것입니다. 내 모습은 다음과 같습니다.
# MainApp/models.py
class BlogPost(models.Model):
title = models.CharField(max_length=100)
subtitle = models.CharField(max_length=200, blank=True, null=True)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
image = models.ImageField(upload_to='blog_images',
storage=gd_storage, null=True, blank=True)
def __str__(self):
return self.author.username + ', ' + self.title[:40]
def get_absolute_url(self):
return reverse('blogpost-detail', kwargs={'pk': self.pk})
# MainApp/views.py
class BlogPostDetailView(DetailView):
model = BlogPost
# template_name = MainApp/BlogPost_detail.html
# context_object_name = 'object'
가장 먼저 해야 할 일:
models.py
에서 BlogComment 모델을 생성해야 합니다. 원하는 방식으로 모델을 개인화할 수 있습니다. 댓글의 기본 사항을 고수하고 작성자, 내용/본문 및 날짜(댓글이 게시된 날짜)와 같은 필드를 추가할 것입니다.# models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogComment(models.Model):
blogpost_connected = models.ForeignKey(
BlogPost, related_name='comments', on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = TextField()
date_posted = models.DateTimeField(default=timezone.now)
def __str__(self):
return str(self.author) + ', ' + self.blogpost_connected.title[:40]
models.py
에서 BlogPost 모델에서 블로그 게시물의 댓글 수를 반환하는 함수를 작성할 수도 있습니다.# models.py
class BlogPost(models.Model):
title = models.CharField(max_length=100)
...
@property
def number_of_comments(self):
return BlogComment.objects.filter(blogpost_connected=self).count()
models.py 파일을 변경할 때마다 터미널을 열고 데이터베이스로 마이그레이션해야 합니다.
# CLI/Terminal
>> cd C:\Projects\...\YourDjangoAppMainFolder
>> python manage.py makemigrations
>> python manage.py migrate
새 양식 클래스를 만들어 보겠습니다. models.py와 동일한 폴더에서
forms.py
라는 새 파일을 만들고 다음을 작성합니다.# forms.py
from django import forms
from .models import BlogComment
class NewCommentForm(forms.ModelForm):
class Meta:
model = BlogComment
fields = ['content']
이제 클래스 기반 뷰 BlogPost DetailView 내의 get_context_data 함수에 views.py에서 다음을 추가할 수 있습니다.
# views.py
from .models import BlogPost, BlogComment
from .forms import NewCommentForm
class BlogPostDetailView(DetailView):
model = BlogPost
# template_name = MainApp/BlogPost_detail.html
# context_object_name = 'object'
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
comments_connected = BlogComment.objects.filter(
blogpost_connected=self.get_object()).order_by('-date_posted')
data['comments'] = comments_connected
if self.request.user.is_authenticated:
data['comment_form'] = NewCommentForm(instance=self.request.user)
return data
여기서 우리는 현재 BlogPost 개체에서 모든 댓글을 검색하고 로컬 변수(쿼리)를 comments_connected에 저장한 다음 HTML 기반의 blogpost_detail에 컨텍스트로 추가로 보냅니다.
그러나 클래스 기반 BlogPost DetailView에서 직접 댓글을 게시하려면 양식(이 보기/html에 있음)에서 컨텍스트를 수신하는 게시 메서드도 정의해야 합니다. 따라서 동일한 클래스에 다음을 추가해야 합니다.
# views.py
class BlogPostDetailView(DetailView):
...
def get_context_data(self, **kwargs):
...
def post(self, request, *args, **kwargs):
new_comment = BlogComment(content=request.POST.get('content'),
author=self.request.user,
blogpost_connected=self.get_object())
new_comment.save()
return self.get(self, request, *args, **kwargs)
마지막으로
blogpost_detail.html
DjangoTemplateLanguage에 다음을 작성해 보겠습니다.<!-- COMMENTS -->
<h2>Leave your comment!</h2>
<div id="comments_section">
{% if user.is_authenticated %}
<form method="POST">
{% csrf_token %}
<div class="form-group">
{{ comment_form }}
<button class="btn btn-info" type="submit">Add comment <i class="fas fa-comments"></i></button>
</div>
</form>
{% else %}
<a class="btn btn-outline-info" href="{% url 'login' %}?next={{request.path}}">Log in to add a comment!</a><br>
{% endif %}
{% if comments %}
<strong class="text-secondary">{{ object.number_of_comments }} Comment{{ object.number_of_comments|pluralize }}</strong>
<hr>
<ul>
{% for comment in comments %}
<li>
<div>
<span>
<strong class="text-info">{{ comment.author }} </strong>
<small class="text-muted">{{ comment.date_posted }}</small>
</span>
<p>
{{ comment.content|safe }}
</p>
</div>
</li>
{% endfor %}
</ul>
{% else %}
<strong class="text-secondary">No comments yet...</strong>
{% endif %}
</div>
정말 많은 코드가 있습니다. 코드의 일부를 단계별로 살펴보겠습니다.
완벽하므로 거의 완료되었습니다! 그러나 이 댓글 섹션은 다소 지루해 보일 것입니다... 따라서 Google 또는... here (덕분에 bootdey.com )에서 찾을 수 있는 스타일을 만들어야 합니다! 이를 통합하려면 예제에 따라
"?next={{request.path}}"
에 CSS 코드를 추가하고 blogpost_detail.html
(목록) 섹션에 해당 태그를 추가하기만 하면 됩니다.좋습니다. 이제 끝났습니다! 이것이 유용하기를 바랍니다. 😁
내 블로그codingtranquillity.herokuapp.com에서 이 댓글 섹션의 실제 예를 볼 수 있습니다. 여기에서 이와 같은 더 많은 기사를 찾을 수도 있습니다!
좋은 하루 보내시고... 행복한 코딩하세요!
R.B.
Reference
이 문제에 관하여(Django 블로그의 댓글 섹션을 만드는 방법!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/radualexandrub/how-to-create-a-comment-section-for-your-django-blog-3egp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)