Backend/Django

[파이썬] Django - SNS 기초 실습 4) Tweet (조회, 댓글)

Sungwoo Koo 2022. 5. 27. 10:18

이전글 : [파이썬] Django - 기초 실습 3) Tweet (게시글)

 

게시글/댓글 조회

1. tweet/views.py에서 detail_tweet 함수 작성

@login_required
def detail_tweet(request, id):
    if request.method == 'GET':
        user = request.user.is_authenticated  # is_authenticated : 로그인 되어 있는지 검사
        if user:
            target_tweet = TweetModel.objects.get(id=id) 
            comment = TweetComment.objects.filter(tweet_id=id)
            return render(request, 'tweet/tweet_detail.html', {'tweet': target_tweet, 'comment': comment})
        else:
            return redirect('/sign-in')  # 로그인 하지 않은 사용자라면 로그인 페이지로 이동

 

2. tweet/urls.py에서 path 추가

path('tweet/<int:id>', views.detail_tweet, name='detail-tweet'),

 

3. templates/tweet/tweet_detail.html 작성

 

댓글 작성

1. tweet/views.py에서 write_comment 함수 작성

@login_required
def write_comment(request, id):
    if request.method == 'POST':
        user = request.user
        target_tweet = TweetModel.objects.get(id=id)
        my_comment = TweetComment()
        my_comment.author = user
        my_comment.tweet = target_tweet
        my_comment.comment = request.POST.get('comment', '')
        my_comment.save()
        return redirect('/tweet/' + str(id))

2. tweet/urls.py에서 path 추가

path('tweet/comment/<int:id>', views.write_comment, name='write-comment'),

3. templates/tweet/tweet_detail.html 작성

 

 

댓글 삭제

1. tweet/views.py에서 delete_comment 함수 작성

@login_required
def delete_comment(request, id):
    my_comment = TweetComment.objects.get(id=id)
    my_comment.delete()
    return redirect('/tweet/' + str(my_comment.tweet_id))

2. tweet/urls.py에서 path 추가

path('tweet/comment/delete/<int:id>', views.delete_comment, name='delete-comment'),

 

3. templates/tweet/tweet_detail.html 조건문 사용 댓글 삭제 버튼 작성

 

tweet_detail.html

{% extends 'base.html' %}

{% block title %}
    게시글 자세히보기
{% endblock %}

{% block content %}
    <div class="container timeline-container">
        <div class="row">
            <!-- 왼쪽 컬럼 -->
            <div class="col-md-3">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">{{ user.username }}</h5>
                        <p class="card-text"> {{ user.bio }}</p>

                    </div>
                </div>
            </div>
            <!-- 오른 쪽 컬럼-->
            <div class="col-md-7">
                <div class="row">
                    <div class="col-md-12 mb-2">
                        <div class="card">
                            <div class="card-body">
                                {% if tweet.author == user %}
                                    <div style="text-align: right">
                                        <a href="/tweet/delete/{{ tweet.id }}">
                                            <span class="badge rounded-pill bg-danger">삭제</span>
                                        </a>
                                    </div>
                                {% endif %}
                                <div class="media">
                                    <div class="media-bod">
                                        <h5 class="mt-0">{{ tweet.content }}</h5>
                                    </div>
                                    <div style="text-align: right">
                                        <span style="font-size: small">{{ tweet.author.username }}-{{ tweet.created_at|timesince }} 전</span>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <!-- 글 작성 하는 곳 -->
                <form class="input-group mb-3" action="/tweet/comment/{{ tweet.id }}" method="post">
                    {% csrf_token %}
                    <input type="text" class="form-control" id='comment' name='comment' placeholder="댓글을 작성 해 주세요"/>
                    <button class="btn btn-outline-secondary" type="submit">작성</button>
                </form>
                <hr>
                <!-- 반복문이 들어 갈 곳 -->
                        {% for cm in comment %}
                    <div class="row">
                        <div class="col-md-12">
                            <div class="media">
                                <div class="media-body">
                                    <h5 class="mt-0"> {{ cm.comment }} </h5>
                                    <span> {{ cm.author }} </span>
                                    <span> - {{ cm.created_at | timesince }} 전</span>
                                </div>
                                {% if cm.author == user %}
                                    <div style="float: right">
                                        <a href="/tweet/comment/delete/{{ cm.id }}">
                                            <span class="badge bg-danger">삭제</span>
                                        </a>
                                    </div>
                                {% endif %}
                            </div>
                        </div>
                    </div>
                    <hr>
                {% endfor %}
                <!-- 반복문이 끝난 곳 -->
            </div>
        </div>
    </div>
{% endblock %}