본문 바로가기
Django/Django Vanila

9. Django 게시글 읽기/삭제

by S.T.Lee 2022. 5. 27.

1. 읽기

읽기는 그냥 GET인데??? 맞다. 그냥 GET이다. 그리고 데이터를 받아오는것도 GET이다.

생각해보니 전에 7강에서 작성한 내용을 database에서 받아오는 행위가 없다. 이를 구현하자.

그렇다 tweet/views.py GET을 수정하면 된다.

def tweet(request):
    if request.method == 'GET':
        user = request.user.is_authenticated
        if user:
        	#수정된 부분
            all_tweet = Tweet.objects.all().order_by('created_at') #만든 순으로 정렬
            return render(request, 'tweet/home.html', {'tweet':all_tweet})
        else:
            return redirect('/sign-in')

{'tweet':all_tweet} 이 부분이 jinja2에서처럼 데이터를 넣는 방법인거 같다.

 

그럼 이제 tweet/home.html을 수정해야 할것이다.

수정 전

<div class="row">
    <div class="col-md-12">
        <div class="card">
            <div class="card-body">
                <div class="media">
                    <div class="media-body">
                        <h5 class="mt-0">Media heading</h5>
                        <p>Will you do the same for me? It's time to face the music I'm no longer your
                            muse.
                            Heard it's
                            beautiful, be the judge and my girls gonna take a vote. I can feel a phoenix
                            inside
                            of me.
                            Heaven is
                            jealous of our love, angels are crying from up above. Yeah, you take me to
                            utopia.</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

 

수정 후

<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>

왜 tw.author.username일까? 그 이유는 tweet.author는 UserModel을 상속 받아서 만들어졌다. 즉, 이 db/my_user의 모든 table을 갖고 있는건데 이 모든것을 부르기에는 불필요한게 많으므로 그 중 username을 불러오는 것이다.

 

그리고 timesince가 있다는걸 처음 알았다...

근데 분이 최소 단위인거 같다?!

전에 프로젝트에서 구현할때 현재 시간에서 그 전 시간을 계산하고 초/분/시간에 따라 나눴었는데 이런 기능이?!

 

timesince

Formats a date as the time since that date (e.g., “4 days, 6 hours”).

Takes an optional argument that is a variable containing the date to use as the comparison point (without the argument, the comparison point is now). For example, if blog_date is a date instance representing midnight on 1 June 2006, and comment_date is a date instance for 08:00 on 1 June 2006, then the following would return “8 hours”:

{{ blog_date|timesince:comment_date }}

Comparing offset-naive and offset-aware datetimes will return an empty string.

Minutes is the smallest unit used, and “0 minutes” will be returned for any date that is in the future relative to the comparison point.

<출처 Django 공식 문서 - https://docs.djangoproject.com/en/4.0/ref/templates/builtins/>

 

주요 내용을 보자면 분이 최소 단위이다. 그 다음 일 / 시간 / 분 이렇게 나오는거 같다. 어쩌면 일 / 시간 까지만 나올수도.

 

 

2. 삭제

우선 tweet/views.py를 수정해주자

from django.contrib.auth.decorators import login_required

@login_required
def delete_tweet(request, id):
    my_tweet = Tweet.objects.get(id=id)
    my_tweet.delete()
    return redirect('/tweet')

그 다음 tweet/urls.py를 수정해주자

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

여기서 <int:id>가 무엇인가 하면 어떤 값이 들어올건데 이를 id에 저장하겠다는 뜻이다. 즉, 저장된 id 변수를 views.py에 delete_tweet 함수로 넘기는 것이다.

 

그러면 이를 어찌 받느냐? HTML을 수정해주면 된다.

<div class="row">
    {% for tw in tweet %}
        <div class="col-md-12 mb-2">
            <div class="card">
                <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>
                    <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>

삭제를 하면 

정상적으로 사라진다!

db를 보면?

마찬가지로 사라졌다!

게시글을 새로 만들고 다른 아이디로 들어가보면

삭제 버튼이 안보이는걸 확인할 수 있다.

'Django > Django Vanila' 카테고리의 다른 글

11. Django Shell  (0) 2022.05.30
10. Django 데이터베이스 관계  (0) 2022.05.30
8. Django 게시글 쓰기  (0) 2022.05.27
7. Django 로그인 이후 기능  (0) 2022.05.27
6. Django에서 제공하는 사용자 기능  (0) 2022.05.27