Language&Framework/Django

Django | 개념 정리_3주차_6. 게시글 읽기/삭제

JUNG씨 2022. 9. 27. 21:18

✅ 게시글 읽기/삭제 ✅

 

1. 게시글 읽어오기

▪️데이터베이스에 있는 게시글 읽어오기 : GET 방식

▪️ tweet앱의 views.py 에서 tweet함수 수정! 요청이 'GET'으로 들어오는 부분 수정

def tweet(request):
    if request.method == 'GET':  # 요청하는 방식이 GET 방식인지 확인하기
        user = request.user.is_authenticated  # 사용자가 로그인이 되어 있는지 확인하기
        if user:  # 로그인 한 사용자라면
            all_tweet = TweetModel.objects.all().order_by('-created_at')
            return render(request, 'tweet/home.html', {'tweet': all_tweet})
        else:  # 로그인이 되어 있지 않다면
            return redirect('/sign-in')

➡️ all_tweet = TweetModel.objects.all().order_by('-created_at') : TweetModel을 created_at의 역순으로 불러오는 코드. 최신글이 항상 위에 있으니까 생성된 시간의 역순으로.

➡️ return render(request, 'tweet/home.html', {'tweet': all_tweet}) : tweet/home.html을 화면에 띄우면서 {'tweet':all_tweet} 라는 데이터를 화면에 전달한다는 뜻!

 

 

 

2. 읽어온 게시글 화면에 노출시키기

<!-- templates/tweet/home.html -->
<hr>
<!-- 작성 된 글이 나오는 곳 -->
<div class="row">
    {% for tw in tweet %}
        <div class="col-md-12 mb-2">
            <div class="card">
                <div class="card-body">
                    <div class="media">
                        <div class="media-body">
                            <h5 class="mt-0">{{ tw.content }}</h5>
                        </div>
                        <div style="text-align: right">
                            <span style="font-size: small">{{ tw.author.username }}-{{ tw.created_at|timesince }} 전</span>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    {% endfor %}
</div>

➡️ views.py에서 넘겨준 TweetModel 이 '리스트'로 전달되기 때문에 반복문을 사용해서 출력한다.

➡️ 각 리스트 하나의 요소는 글쓰기 모델 하나. 그 안에 포함된 content, author, created_at 등의 요소를 뽑을수 있다.

 

 

3. 게시글 삭제하기

게시글을 각각의 고유한 게시글 id가 있어서 이 id 번호를 사용해서 '어떤 게시글'을 지울지 판단할 수 있다.

로그인이 되어있어야만 삭제할 수 있도록, '내가 쓴 글'만 삭제할 수 있도록 !

▪️ 게시글 삭제 view 만들기 -> tweet앱의 views.py에 delete_tweet함수 추가! @login_required 사용!

from django.contrib.auth.decorators import login_required


@login_required
def delete_tweet(request, id): # 게시글 고유의 id 인자 추가/게시글 구분하는데 사용
    my_tweet = TweetModel.objects.get(id=id)
    my_tweet.delete()
    return redirect('/tweet')

 

▪️ 게시글 삭제 url 만들기 : tweet앱의 urls.py와 연결

# tweet/urls.py 에 추가

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

➡️ tweet/delete/<int:id>: tweet/delete/123 과 같이 맨 뒷자리에 숫자가 온다는 얘기이고, 이 숫자는 id에 담겨져 delete_tweet에 전달됨.

➡️ 이 id를 views.py의 delete_tweet(request,id) 에서 매개변수로 받아 사용한다.

 

▪️ home.html에 게시글 삭제 url 넣어주기

<div class="card-body">
    {% if tw.author == user %}
    <div style="text-align: right">
        <a href="/tweet/delete/{{ tw.id }}">
            <span class="badge rounded-pill bg-danger">삭제</span>
        </a>
    </div>
    {% endif %}
    <div style="text-align: right">
        <a href="#">
            <span class="badge rounded-pill bg-success">보기</span>
        </a>
    </div>

➡️ 이 게시글의 author (글쓴이) 와, 로그인 한 사용자가 같을 때에만 '삭제' 버튼이 나타난다.

➡️ 삭제 버튼은 /tweet/delete/tw.id 로 연결이 되는데, 이 tw.id는 게시글의 고유 id값이다.