# articles/models.py
from django.db import models
from django.conf import settings
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
content = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.content
$ python manage.py makemigrations
$ python manage.py migrate
인증된 회원의 댓글 작성 구현하기
# articles/forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
exclude = ('article', 'user',)
NOT NULL constraint failed: articles_comment.user_id
에러 발생# articles/views.py
def comments_create(request, pk):
article = Article.objects.get(pk=pk)
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.article = article
comment.user = request.user
comment.save()
return redirect('articles:detail', article.pk)
<!-- articles/detail.html -->
<ul>
{% for comment in comments %}
<li>
{{ comment.user }} - {{comment.content}}
<form action="{% url 'articles:comments_delete' article.pk comment.pk%}" method="POST">
{% csrf_token %}
<input type="submit" value="삭제">
</form>
</li>
{% empty %}
<li>댓글이 없습니다 :(</li>
{% endfor %}
</ul>
# articles/views.py
def comments_delete(request, pk, comment_pk):
comment = Comment.objects.get(pk=comment_pk)
if request.user == comment.user:
comment.delete()
return redirect('articles:detail', pk)
# articles/views.py
def comments_delete(request, pk, comment_pk):
comment = Comment.objects.get(pk=comment_pk)
if request.user == comment.user:
comment.delete()
return redirect('articles:detail', pk)
is_authenticated 와 View decorator를 활용하여 코드 정리하기
# articles/views.py
from django.views.decorators.http import require_POST
@require_POST
def comments_create(request, pk):
if request.user.is_authenticated:
article = Article.objects.get(pk=pk)
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.article = article
comment.user = request.user
comment.save()
return redirect('articles:detail', article.pk)
return redirect('accounts:login')
@require_POST
def comments_delete(request, pk, comment_pk):
if request.user.is_authenticated:
comment = Comment.objects.get(pk=comment_pk)
if request.user == comment.user:
comment.delete()
return redirect('articles:detail', pk)
{% if request.user.is_authenticated %}
<form action="{% url 'articles:comments_create' article.pk %}" method="POST">
{% csrf_token %}
{{comment_form}}
<input type="submit" value="저장">
</form>
{% else %}
<a href="{% url 'accounts:login' %}">[댓글을 작성하려면 로그인하세요.]</a>
{% endif %}