
-> 문제가 발생한다



1) 댓글이 어떻게 시각화 될것인지 레이아웃을 간단하게 html 파일로 만들기
2) 댓글을 달았을 때 그 게시물로 돌아가도록 설정
3) 모델을 구성하는 정보들은 어떤 게시글에 달려있는 댓글인지, 댓글 글쓴이가 누구인지, 댓글 내용이 어떤지, 언제 만들어졌는지를 구현
#Terminal
python manage.py startapp commentapp
#/pragmatic/pragmatic/settings.py
INSTALLED_APPS = [
...
'commentapp', # 추가
]
#/pragmatic/pragmatic/urls.py
urlpatterns = [
...
path('comments/', include('commentapp.urls')), # 추가
]
from django.contrib.auth.models import User
from django.db import models
from articleapp.models import Article
# Create your models here.
class Comment(models.Model):
# article, writer 둘 다 서버단에서 확인을 하기 위해 추가적인 hidden input 을 추가해야한다.
# -> create.html 에 <input type="hidden" name="article_pk" value=""> 부분 추가
article = models.ForeignKey(Article, on_delete=models.SET_NULL, null=True, related_name='comment')
writer = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='comment')
content = models.TextField(null=False) # content 는 입력을 받을 것
created_at = models.DateTimeField(auto_now=True) # created_at 은 자동으로 생성될 것
from django.forms import ModelForm
from commentapp.models import Comment
class CommentCreateForm(ModelForm):
class Meta:
model = Comment
fields = ['content']
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
# view 작성
from django.shortcuts import render
from django.urls import reverse
from django.views.generic import CreateView
from commentapp.forms import CommentCreationForm
from commentapp.models import Comment
# Create your views here.
class CommentCreateView(CreateView):
model = Comment
form_class = CommentCreationForm
template_name = 'commentapp/create.html'
def get_success_url(self):
return reverse('articleapp:detail', kwargs={'pk': self.object.article.pk})
#/pragmatic/commentapp/urls.py
from django.urls import path
from commentapp.views import CommentCreateView
app_name = 'commentapp'
urlpatterns = [
path('create/', CommentCreateView.as_view(), name='create'),
]
<!--{% extends 'base.html' %} 두번 html 을 가져오기 때문에 이부분은 생략-->
{% load bootstrap4 %}
{% block content %}
<div style="text-align : center; max-width: 500px; margin: 4rem auto;">
<div class="mb-4"> <!-- margin bottom 해서 4배 -->
<h4>Comment Create</h4>
</div>
<form action="{% url 'commentapp:create' %}" method="post"> <!--url 일원화, post 방식 으로 전송 -->
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
<input type="hidden" name="article_pk" value="{{ article.pk }}">
</form>
</div>
{% endblock %}

<!--/Users/seonik/PycharmProjects/pragmatic/articleapp/templates/articleapp/detail.html -->
{% include 'commentapp/create.html' with article=target_article %}
<!-- 이후 create 안에서 article 이라는 변수를 사용할 수 있게 된다 -->
<!--숨겨서 보내는 article pk 의 value 에 {{ article.pk }} 를 담아서 보내도록 수정 -->




# /pragmatic/commentapp/views.py
from django.urls import reverse
from django.views.generic import CreateView
from articleapp.models import Article
from commentapp.forms import CommentCreationForm
from commentapp.models import Comment
class CommentCreateView(CreateView):
model = Comment
form_class = CommentCreationForm
template_name = 'commentapp/create.html'
# 추가
def form_valid(self, form):
temp_comment = form.save(commit=False)
temp_comment.article = Article.objects.get(pk=self.request.POST['article_pk'])
temp_comment.writer = self.request.user
temp_comment.save()
return super().form_valid(form)
def get_success_url(self):
return reverse('articleapp:detail', kwargs={'pk': self.object.article.pk})
{% load bootstrap4 %}
{% block content %}
<div style="text-align : center; max-width: 500px; margin: 4rem auto;">
<div class="mb-4"> <!-- margin bottom 해서 4배 -->
<h4>Comment Create</h4>
</div>
<form action="{% url 'commentapp:create' %}" method="post"> <!--url 일원화, post 방식 으로 전송 -->
{% csrf_token %}
{% bootstrap_form form %}
<!-- 추가 -->
{% if user.is_authenticated %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
{% else %}
<a href="{% url 'accountapp:login' %}?next={{ request.path }}"
class="btn btn-dark rounded-pill col-6 mt-3">
Login
</a>
{% endif %}
<!---->
<input type="hidden" name="article_pk" value="{{ article.pk }}">
</form>
</div>
{% endblock %}
