이제 이 안에 게시글 기능을 만들 것이다.
게시글 하니 초창기에 만든 POST, GET 기능이 생각난다. 바로 그거를 사용해보려고 한다.
게시글 POST
게시글 내용을 서버로 가져오려고 한다.
이번에는 클라이언트부터 먼저 손을 댈 건데, 이유는 서버 작업에 필요한 정보가 클라이언트에 있기 때문이다.
form의 ID값을 나중에 써먹을 것이다.
게시글에 대한 보안 처리를 역시 실행해주었다.
<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>
그 다음 마찬가지로 urls 부분을 채워주어야 한다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('tweet/', views.tweet, name='tweet')
]
urls 부분을 채워줬으면 마지막으로 views 부분까지 채워주기
elif request.method == 'POST':
user = request.user # 로그인 한 user 불러오기
my_tweet = TweetModel() # 글쓰기 모델 불러오기
my_tweet.author = user # 모델에 사용자 저장
my_tweet.content = request.POST.get('my-content', '') # 모델에 글 저장
my_tweet.save() # 내용 저장
return redirect('/tweet') # 다시 트윗 창으로 가기
그리고 클라이언트에서 POST 기능을 사용하면 데이터베이스에 다음과 같이 정보가 들어온다.
게시글 GET
GET은 사실 어려운 과정은 아니어서..
POST 할 줄 알면 GET도 어렵지 않을 것이다.
하지만 이번 순서는 평소처럼 파이썬 함수부터 손 댈 것이다.
먼저 tweet 함수에서, 사용자가 로그인했을 경우에 TweetModel의 데이터를 가져오게끔 한다.
all_tweet = TweetModel.objects.all().order_by('-created_at')
# tweet 모델에 저장된 모든 데이터를 저장된 순서에 따라 들고 옴
return render(request, 'tweet/home.html', {'tweet':all_tweet})
그 다음 tweet의 content, author.username, created_at을 가져온다.
위에는 for tw in tweet의 for 구문을 써서 각각의 tweet 데이터를 모두 가져오게끔 한다.
{% 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>
게시글 DELETE
그 다음은 게시글 삭제 기능이다.
이것은 삭제 버튼을 만들고, 삭제 버튼에 GET과 POST 기능을 모두 해줘야 한다.
삭제함수를 먼저 만들어준다.
login_required는 알다시피 로그인했을 경우에만 함수가 유효하다는 것이다.
그리고 id가 일치한 경우 my_tweet을 가져와 삭제한다는 내용이다.
def delete_tweet(request, id):
my_tweet = TweetModel.objects.get(id=id)
my_tweet.delete()
return redirect('/tweet')
이제 다음과 같이 urls.py에 있는 urlpatterns에 추가해준다. 그럼 url 연결이 가능.
# delete_tweet 함수의 request, id로 넘어감
최종적으로 삭제 버튼에 조건문을 넣고 다음과 같이 설정해주면 완성!
<div style="text-align: right">
<a href="/tweet/delete/{{ tw.id }}">
<span class="badge rounded-pill bg-danger">삭제</span>
</a>
</div>
{% endif %}
'Framework > Django' 카테고리의 다른 글
VS code 오류[갑자기 가상환경이 작동하지 않는다!] (0) | 2023.04.11 |
---|---|
장고 개인 프로젝트 이전 ERD 공부 (2) | 2023.04.05 |
로그인 이후 기능 다듬기 작업 (0) | 2023.04.04 |
장고 모델과 사용자 모델 비교, 사용자 모델 업그레이드하기 (0) | 2023.04.04 |
사용자 관리 : 회원가입과 로그인 실습 (0) | 2023.04.04 |