점프 투 장고를 그대로 베끼는 것이 아니라서 다시 올립니다.

'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 299

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 오후

그러면 comment_set으로 쓰려면 related_name='comment_set'으로 바꾸면 되는 건가요? - oshmos님, 2022년 6월 24일 11:50 오후 추천 , 대댓글
아 그냥 related_name을 안쓰면 기본값이 모델명_set이네요. 진짜 감사합니다! - oshmos님, 2022년 6월 24일 11:54 오후 추천 , 대댓글