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이 되는 것.
<!-- 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
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
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 함수로 넘어간다.
<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>