django 3-11 게시글 읽기, 삭제

Grace Goh·2022년 10월 11일
0

Django

목록 보기
18/32
from django.shortcuts import render, redirect
from .models import TweetModel


def tweet(request):
    if request.method == 'GET':
        user = request.user.is_authenticated
        if user: # 로그인한 사용자가 있다면 TweetModel에 저장한 모든 모델 불러온다.
            all_tweet = TweetModel.objects.all().order_by('-created_at')
            return render(request, 'tweet/home.html', {'tweet':all_tweet})
        else:
            return redirect('/sign-in')

    elif request.method == 'POST':
        user = request.user
        my_tweet = TweetModel()
        my_tweet.author = user
        my_tweet.content = request.POST.get('my-content', '')
        my_tweet.save()
        return redirect('/tweet')

최신순 : 시간순의 역순.

  • .order_by 정렬
  • - 역순으로

변수 all_tweet에 저장하여 다음 방식으로 화면에 넘겨준다.

return render(request, 'tweet/home.html', {'tweet':all_tweet})

{'tweet':all_tweet} '이 데이터를 화면에 넘겨주겠다' 의미.
tweet/home.html 화면으로 딕셔너리 형태로 넘겨준다.
데이터의 key값은 tweet이 되는 것.


tweet/home.html

<!-- templates/tweet/home.html -->

    <!-- 작성된 글이 나오는 곳 -->
    <div class="row">
        {% for tw in tweet %} # dict {all_tweet}의 key값인 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>

{% for tw in tweet %}
딕셔너리 {all_tweet}의 key값인 tweet
for문으로, tw는 tweet list 중 하나를 의미한다.
반복문이 끝날 때까지 출력된다.

{{ tw.content }}
해당 트윗에 우리가 작성한 내용을 불러온다.

{{ tw.author.username }}
author라고만 하면 UserModel 전체를 불러오는데 (아래 코드 참고)
그 중에서 username만 출력하겠다는 의미.

{{ tw.created_at }} 월일시분 only
{{ tw.created_at|timesince }} 전 '~분 전' 표시.

# tweet/models.py
class TweetModel(models.Model):
    class Meta:
        db_table = "tweet"

    # tw.author라고 하면 유저모델이 가진 전부(이름, pw, 이메일 등..)를 가져온다.
    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    content = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

tweet/views.py 삭제 기능 만들기

# tweet/views.py

from django.shortcuts import render, redirect
from .models import TweetModel
from django.contrib.auth.decorators import login_required # 추가


# (...)

@login_required()
def delete_tweet(request, id): # 아래 urls.py로부터 전달 받음
    my_tweet = TweetModel.objects.get(id=id)
    my_tweet.delete()
    return redirect('/tweet') # 현재 화면이 tweet

get() 특정 인자만 불러와야 하기 때문.

함수(view)를 만들었으니 url과 연결한다.

tweet/urls.py

# tweet/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('tweet/', views.tweet, name='tweet'), 
    path('tweet/delete/<int:id>', views.delete_tweet, name='delete-tweet'),
    # 오류가 난다면 콤마 확인
]

<int:id> 숫자가 올 건데, id라는 변수에 저장하겠다.
이 id값이 tweet/views.py의 delete_tweet 함수로 넘어간다.


home.html

    <div class="card-body">
        {% if tw.author == user %} # 이 글 작성 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>

profile
Español, Inglés, Coreano y Python

0개의 댓글