1) Posts App
1-1. OverView
- Comment 모델 작성
- 1:N relation 두개
- 누구의 코멘트인가?
- 어느 포스트의 코멘트인가?
- 1:N relation 두개
- Comment를 작성하기 위한 Form
- ModelForm
- 한 페이지에 있는 여러개의 Form을 처리하기
- create_comment
- Post 메서드만 취급하기
- 부분적인 정보만 가지고 있는 객체를 만들기
- create_comment
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
-
설치
pip install django-extensions pip install django-bootstrap4
-
설정
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', # 추가 ]
-
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을 처리하기
-
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, })
-
각각의 ModelForm을 구분하기
create_comment 액션의 url을 통해서 구분할 수 있습니다.
<form action="{% url 'posts:comment_create' post.id %}" method="POST">
-
create_comment
- POST 메서드만 허용함.
- 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)