Framework/Django

게시글 기능 만들기

JM Lee 2023. 4. 4. 15:32
728x90

이제 이 안에 게시글 기능을 만들 것이다.

게시글 하니 초창기에 만든 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의 데이터를 가져오게끔 한다.

if user:
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 데이터를 모두 가져오게끔 한다.

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

게시글 DELETE

그 다음은 게시글 삭제 기능이다.

이것은 삭제 버튼을 만들고, 삭제 버튼에 GET과 POST 기능을 모두 해줘야 한다.

 

삭제함수를 먼저 만들어준다.

login_required는 알다시피 로그인했을 경우에만 함수가 유효하다는 것이다.

그리고 id가 일치한 경우 my_tweet을 가져와 삭제한다는 내용이다.

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

 

이제 다음과 같이 urls.py에 있는 urlpatterns에 추가해준다. 그럼 url 연결이 가능.

path('tweet/delete/<int:id>', views.delete_tweet, name='delete-tweet'), #tweet delete id 값인 정수를 받아줘야 함
# delete_tweet 함수의 request, id로 넘어감

 

최종적으로 삭제 버튼에 조건문을 넣고 다음과 같이 설정해주면 완성!

{% 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 %}