My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


인스타 클론코딩 4, Posts앱 (4) - Comment

1) Posts App

1-1. OverView

  1. Comment 모델 작성
    • 1:N relation 두개
      • 누구의 코멘트인가?
      • 어느 포스트의 코멘트인가?
  2. Comment를 작성하기 위한 Form
    • ModelForm
  3. 한 페이지에 있는 여러개의 Form을 처리하기
    • create_comment
      1. Post 메서드만 취급하기
      2. 부분적인 정보만 가지고 있는 객체를 만들기

2) Comment

2-1. Comment 모델 작성

class Comment(models.Model):
    content = models.CharField(max_length=100)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

2-2. CommentModelForm

from django import forms
from .models import Comment

class CommentModelForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content']

form을 조금 꾸미고 싶으면 widget 매개변수를 통해서 attr을 설정하는 방법도 있지만,

가장 간단하게는 django-bootstrap4를 이용해서 꾸밀 수 있다.

2-3. Bootstrap form

  1. 설치

    pip install django-extensions
    pip install django-bootstrap4
    
  2. 설정

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django_extensions', # 추가
        'posts',
        'accounts',
        'bootstrap4', # 추가
    ]
    
  3. form.html

       
    {% load bootstrap4 %} <!-- 특별히 로드가 필요함 -->
       
    <div class="modal-body">
        <form action="{% url 'posts:comment_create' post.id %}" method="POST"> 
            {% csrf_token %}
            {% bootstrap_form comment_form %} <!-- 이부분 바뀜 -->
        </form>
    </div>
       
    

2-4. 여러개의 Form을 처리하기

  1. ModelForm 제공하기

    포스트에 댓글을 다는 Form을 만들어야하는데,

    한 사람이 여러개의 포스트를 작성하기 때문에, 포스트마다 Form을 달아줘야합니다.

    def profile(request, user_name):
        person = get_object_or_404(get_user_model(), username=user_name)
        comment_form = CommentModelForm()
        post_form = PostModelForm() # 일단 같은 ModelForm을 넘겨주기.
        return render(request, 'posts/profile.html',{
            'person' : person,
            'comment_form' : comment_form,
            'post_form' : post_form,
        })
    
  2. 각각의 ModelForm을 구분하기

    create_comment 액션의 url을 통해서 구분할 수 있습니다.

       
    <form action="{% url 'posts:comment_create' post.id %}" method="POST"> 
       
    
  3. create_comment

    1. POST 메서드만 허용함.
    2. user 정보를 추가적으로 저장하므로 commit=False를 이용하기.
    @require_POST
    def comment_create(request, post_id):
        post = get_object_or_404(Post, id=post_id)
        comment_form = CommentModelForm(request.POST)
        if comment_form.is_valid():
            comment = comment_form.save(commit=False)
            comment.user = request.user
            comment.post = post
            comment.save()
        return redirect('profile', request.user)
    
comments powered by Disqus