본문 바로가기
Django

[Django] 게시글 쓰기 기능 만들기 #####

by kming 2023. 5. 25.

<aside> 💡 SNS의 대표적인 기능인 '게시글 쓰기' 를 사용 해 보면서 데이터베이스를 다뤄볼게요!

</aside>

게시글 작성은 HTTP 요청 방식 중, POST를 사용해서 이루어지게 됩니다.

POST 메서드를 사용해서 우리가 만든 글을 데이터베이스에 저장 해 보도록 할게요!

게시글에 포함되는 정보는 사용자정보, 작성한 글, 작성 시간 등의 정보가 필요합니다!

우리는 2주차에 ORM을 가지고 makemigrations 명령어를 사용해서 테이블을 이미 만들었어요! 우리가 글들을 저장할 테이블은 'tweet' 테이블 입니다.

게시글 작성하기는 http://127.0.0.1:8000/tweet 의 주소로 POST 요청을 하려고 해요!

같은 url이라도 요청 방식 (POST, GET) 에 따라서 다른 방식으로 접근이 된다는 점 잘 기억 하면서 기능을 구현 해 보도록 하겠습니다!

    1. 글 작성 할 html 만들기
    글을 작성 할 html을 만들어야 합니다!그 중, "나의 이야기를 적어주세요" 라는 부분을 찾아서 확인 해 줄게요. 강의안에는 굵은 글씨로 표시 해 놓았습니다!
    • form태그가 있고, 그 안쪽에 textarea의 name과 id가 my-content로 되어있습니다.
    • form 태그에 action과 method를 사용해서 django의 url로 연결시켜 주려고 해요!
    우리는 POST 방식을 사용해서 글을 작성하려고 합니다. 그리고 http://127.0.0.1:8000/tweet 의 주소로 요청 한다는 것도 모두 정한 상태에요~! 정한 내용을 바탕으로 form태그에 추가적인 설정들을 해 주도록 하겠습니다.
    • method = 'post'
    • action = '/tweet/'
    위의 값들을 form태그에 적용 해 주겠습니다.이제 화면에서의 작업은 마쳤으니 view와 url을 만들어 주도록 하겠습니다!
  • ... 생략 **<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> **... 생략**
  • <!-- templates/tweet/home.html --> ... 생략 <!-- 글을 작성 하는 곳 --> <div class="row mb-2"> <div class="col-md-12"> <div class="card"> <div class="card-body"> <div class="media"> <div class="media-body"> **<h5 class="mt-0">나의 이야기를 적어주세요</h5>** **<p>** **<form> <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> </div> </div> </div> </div> </div> <hr> ... 생략
  • 사실 제가 이전에 코드를 이미 제공 했어요~! templates 폴더 안의 tweet폴더에 작성되어있는 home.html을 열어주세요!
    1. 글을 저장 할 view 만들기
    글을 작성하는 기능은 http://127.0.0.1/tweet 에 POST 형식으로 요청하게 됩니다.tweet앱의 urls.py를 확인 해 보니까 이미 /tweet이 view와 연결이 되어 있네요!위에 작성이 되어있는대로 tweet앱의 views.py안에 있는 tweet 함수를 수정 해 주도록 할게요.
    # tweet/views.py
    
    def tweet(request):
        if request.method == 'GET':  # 요청하는 방식이 GET 방식인지 확인하기
            user = request.user.is_authenticated  # 사용자가 로그인이 되어 있는지 확인하기
            if user:  # 로그인 한 사용자라면
                return render(request, 'tweet/home.html')
            else:  # 로그인이 되어 있지 않다면
                return redirect('/sign-in')
    
    글을 쓰고 데이터베이스에 저장 해야 하기 때문에 글과 관련된 모델을 추가 해 주고 아래와 같이 작성 해 주도록 할게요~!
    **from .models import TweetModel # 글쓰기 모델 -> 가장 윗부분에 적어주세요!**
    
    def tweet(request):
        if request.method == 'GET':  # 요청하는 방식이 GET 방식인지 확인하기
            user = request.user.is_authenticated  # 사용자가 로그인이 되어 있는지 확인하기
            if user:  # 로그인 한 사용자라면
                return render(request, 'tweet/home.html')
            else:  # 로그인이 되어 있지 않다면
                return redirect('/sign-in')
        **elif request.method == 'POST':  # 요청 방식이 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')**
    
    여기서 자세히 볼 코드는 두 줄 정도 될 것 같아요.
    • user = request.user
      → 장고에서는 요청에 자동적으로 인증을 추가해요! 현재 요청이 누구에게서 요청 된 것인지 확인 할 수 있습니다.
    • my_tweet.content = request.POST.get('my-content','') → html에서 id와 name이 'my-content'였어요! 위처럼 작성하면 POST 형식으로 요청 한 데이터를 id와 name을 가지고 올 수 있습니다.
    http://127.0.0.1:8000/tweet 로 들어가서 글을 쓴 후에, 데이터베이스를 확인하면 데이터가 그대로 들어가 있는 것을 확인 할 수 있습니다!
  • 데이터베이스 모델을 추가 해 주는 부분은 views.py의 가장 윗부분에 적어주고, 아래의 굵은 글씨로 쓴 부분을 tweet 함수에 추가 해 주세요.
  • 아래의 코드는 수정 하기 전의 tweet 함수인데요, request 방식이 'POST' 인 부분이 만들어지지 않았네요.
  • from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('tweet/', views.tweet, name='tweet') ]
  • 글 관련 기능들은 tweet 앱에 작성을 해 보려고 합니다!