점프 투 장고를 그대로 베끼는 것이 아니라서 다시 올립니다.
'posts/models.py'
from django.db import models
from common.models import User
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name='post_author')
dt_created = models.DateTimeField(auto_now_add=True)
dt_updated = models.DateTimeField(null=True, blank=True)
def __str__(self):
return self.title
class Comment(models.Model):
content = models.TextField()
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post')
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name='comment_author')
dt_created = models.DateTimeField(auto_now_add=True)
dt_updated = models.DateTimeField(null=True, blank=True)
def __str__(self):
return self.content
'posts/forms.py'
from django import forms
from .models import Post, Comment
class Postform(forms.ModelForm):
class Meta:
model = Post
exclude = ('author', 'dt_updated',)
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['content']
'posts/views.py'
@login_required(login_url='account_login')
def comment_create(request, post_id):
post = get_object_or_404(Post, id=post_id)
content = request.POST.get('content')
comment = Comment(post=post, content=content, author=request.user)
comment.save()
return redirect('posts:post_detail', post_id)
'templates/posts/post_detail.html'
{% extends 'base.html' %}
{% block content %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-dismissible alert-danger text-center">
<strong>{{message}}</strong>
</div>
{% endfor %}
{% endif %}
<div class="container my-3">
<div class="card my-3">
<div class="card-body">
<div class="card-text" style="white-space: pre-line;">
<h3>{{ post.title }}</h3>
<p>{{ post.content }}</p>
</div>
<div class="d-flex justify-content-end">
{% if post.dt_updated %}
<div class="badge bg-light p-2 text-dark text-start mx-3">
<div class="mb-2">{{ post.author }}</div>
<div>{{ post.dt_updated }}(수정됨)</div>
</div>
{% else %}
<div class="badge bg-light p-2 text-dark text-start">
<div class="mb-2">{{ post.author }}</div>
<div>{{ post.dt_created }}</div>
</div>
{% endif %}
</div>
<div class="my-3">
<a href="{% url 'posts:post_list' %}"
class="btn btn-sm btn-outline-secondary">목록</a>
<a href="{% url 'posts:post_update' post.id %}"
class="btn btn-sm btn-outline-secondary">수정</a>
<a href="{% url 'posts:post_delete' post.id %}"
class="delete btn btn-sm btn-outline-secondary">삭제</a>
</div>
<form action="{% url 'posts:comment_create' post.id %}" method="POST" class="my-3">
{% csrf_token %}
<textarea name="content" id="content"
{% if not user.is_authenticated %}disabled{% endif %}
class="form-control" rows="10" ></textarea>
<hr>
<input type="submit" value="댓글 등록" class="btn btn-primary">
</form>
{% if post.comment_set.all %}
<p><b>{{ post.comment_set.count }}개의 댓글이 있습니다.</b></p>
<ul>
{% for comment in post.comment_set.all %}
<li>
{{ comment.user }} - {{ comment.content }}
</li>
{% endfor %}
</ul>
{% empty %}
<p>댓글이 없어요..</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}
post_detail.html에서 댓글을 작성하고 바로 redirect로 같은 페이지에서 댓글을 보여주려고 하는 중이라서 코드가 다음과 같습니다.
그런데 분명히 댓글을 저장이 되어서 admin 페이지에서 볼 수가 있는데 템플릿에서는 확인이 불가능합니다.
12시간 째 중이라서 정말 도움이 시급합니다.. ㅠㅠ
oshmos 님 821
2022년 6월 24일 11:12 오후
1개의 답변이 있습니다. 1 / 1 Page
Comment 모델의 post 필드가 다음처럼 되어 있기 때문에
related_name='post'
post.comment_set 이 아니라 post.post 로 사용하셔야 합니다. related_name은 post 대신 comment_post 와 같은 이름으로 바꾸시는게 나을듯요.
박응용 님
2022년 6월 24일 11:44 오후