이전글 : [파이썬] Django - 기초 실습 2) Tweet (홈 화면)
게시글 쓰기
1. templates/tweet/home.html에서 게시글 form 설정
...
<div class="media-body">
<h5 class="mt-0">나의 이야기를 적어주세요</h5>
<p>
<form action="/tweet/" method="post">
{% csrf_token %}
<div class="form-group mb-2">
<textarea class="form-control" style="resize: none" name='my-content' id="my-content"></textarea>
</div>
<button type="submit" class="btn btn-primary" style="float:right;">작성하기</button>
</form>
</p>
</div>
...
2. tweet/views.py의 tweet 함수에 POST 방식 작성
def tweet(request):
if request.method == 'GET':
user = request.user.is_authenticated # is_authenticated : 로그인 되어 있는지 검사
if user:
return render(request, 'tweet/home.html') # 로그인 한 사용자라면 home.html 이동
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')
게시글 읽기
1. templates/tweet/home.html에서 게시글 목록 반복문 작성
...
<!-- 작성 된 글이 나오는 곳 -->
<div class="row">
{% for tw in tweet %}
<div class="col-md-12">
<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>
...
2. tweet/views.py의 tweet 함수에 GET 방식 작성
def tweet(request):
if request.method == 'GET':
user = request.user.is_authenticated # is_authenticated : 로그인 되어 있는지 검사
if user:
all_tweet = TweetModel.objects.all().order_by('-created_at') # -created_at : created_at 기준 역순 (최신 먼저)
return render(request, 'tweet/home.html', {'tweet': all_tweet}) # 로그인 한 사용자라면 home.html 이동
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')
게시글 삭제 (tweet/delete/게시글id)
1. tweet/views.py의 delete_view 함수작성
# login_required : 로그인이 되어 있어야만 실행할 수 있음
@login_required
def delete_tweet(request, id):
my_tweet = TweetModel.objects.get(id=id)
my_tweet.delete()
return redirect('/tweet')
2. tweet/urls.py에서 작성한 delete_view 함수 등록
# tweet/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'), # 127.0.0.1:8000 과 views.py 폴더의 home 함수 연결
path('tweet/', views.tweet, name='tweet'), # 127.0.0.1:8000/tweet 과 views.py 폴더의 tweet 함수 연결
# delete/<int:id> 는 tweet의 id를 id라는 변수에 저장되어 delete_tweet 함수로 넘어간다
path('tweet/delete/<int:id>', views.delete_tweet, name='delete-tweet'),
]
3. templates/tweet/home.html에서 if문 사용하여, 삭제/보기 버튼 추가
<!-- 작성 된 글이 나오는 곳 -->
<div class="row">
{% for tw in tweet %}
<div class="col-md-12">
<div class="card">
<div class="card-body">
{% if tw.author == user %} {# 로그인한 사용자가 작성자일 경우 삭제버튼 표시 #}
<div style="text-align: right">
<a href="/tweet/delete/{{ tw.id }}"> {# id값으로 삭제 #}
<span class="badge rounded-pill bg-danger">삭제</span>
</a>
</div>
{% endif %}
<div style="text-align: right">
<a href="/tweet/{{ tw.id }}"> {# id값으로 조회 #}
<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>
'Backend > Django' 카테고리의 다른 글
[파이썬] Django - SNS 기초 실습 6) 회원가입/로그인/친구 서비스 디테일 (0) | 2022.05.30 |
---|---|
[파이썬] Django - SNS 기초 실습 5) Follow (ManyToMany) (0) | 2022.05.30 |
[파이썬] Django - SNS 기초 실습 4) Tweet (조회, 댓글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 2) Tweet (홈 화면) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 1) User (0) | 2022.05.27 |