완숙의 블로그

[Django] Week 4_3 Blog & Portfolio Project_2 본문

Programing Language/Web_Django

[Django] Week 4_3 Blog & Portfolio Project_2

완숙 2019. 2. 26. 22:21

자! 그런데 이제 글을 쓰려면 항상 /admin 으로 들어가야되니까 너무 싫어.

 

2019-02-26 9 07 35

그러니까 만들자!

 

어떻게 만들까?

 

  1. NAV바에 글쓰기 버튼을 만든다.
  2. 글쓰기 버튼을 누르면 입력창이 뜬다.
  3. 제출을 누르면 해당 입력한 내용의 detail 페이지가 뜬다.

 

시작!

구상부터 시작해보자.

 

글쓰기 버튼을 누를 때, 어떤 path로 보낼지 정해줘야 한다.

그 path 에 해당하는 views.py에 함수를 만들어준다.

그리고 이 함수가 반환하는 값에 html을 보여준다.

그러니 new.html 부터 만들자

 

그 다음, new.html 에서 데이터를 보내는 것은 form 태그의 submit 버튼을 눌러 보낼 수 있었다.

여기서 관건은, 그럼 submit 을 누름과 동시에 이번에는 database 에 정보를 입력 하는 것이 중요!

어디서 구현할 수 있을까?

 

당연히 views.py 이다!

정보를 처리하는 것을 관장하는 파일이기 때문!

 

정리하면, new.html 에서 submit 을 누르면 views.py 의 new 함수로 가게 될 것이고,

여기서 우리는 이 정보를 database 에 등록해야한다!

근데 우리는 /admin 에서만 등록하는 걸 배웠으니, 이제 views.py 안에서 바로 등록하는 법을 배워야 한다!

이 함수를 배워보자!

 

만들기

  1. link 라는 부분을 바꿔주자.

    <!-- home.html -->
    ...
    <a class="nav-link" href="#">Link</a>
    을
    <a class="nav-link" href="#">글쓰기</a>
    로 바꾸자.
    

     

  2. 그리고 이녀석을 누르면 new라고 이름 지어줄 path로 가도록 등록까지 해주자.

    <a class="nav-link" href="{% url 'new' %}">글쓰기</a>
    

     

  3. new.html 을 만들자.

     

  4. 이 안에 우리는 NAVbar와 form 태그를 사용해서 제출할 용지를 만들어줘야 한다.

    <!-- new.html -->
    <!-- 앞에 NAvbar 복붙 -->
    <div class = "container">
        <form action="">
            <h4> 제목 : </h4>
            <input type = "text" name = "title">
            <br>
            <br>
            <h4> 본문 : </h4>
            <textarea cols=40 rows=10 name = "body">
            <br>
            <br>
            <input class="btn btn-dark" type = "submit" vlaue = "제출하기">
        </form>
    </div>
    

     

  5. 자 그 다음, 애초에 글쓰기 버튼을 누르면 이 화면으로 가야되니까 urls.py 에 가서 경로설정해주자.

    # urls.py
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', blog.views.home, name = "home"),
        path('blog/<int:blog_id>', blog.views.detail, name = "detail"),
        path('blog/new', blog.views.new, name = "new"), # 이녀석
    ]
    

     

  6. 그리고 누르면 보여줘야 되니 views.py 에 가서 함수를 만들어주자.

    # views.py
    def new(request):
        return render(request, 'new.html')
    

     

  7. 서버 돌려서 확인!

     

  8. 자 이제 본게임!

    이제 form 태그를 어디로 보낼지에 대한 얘기!

    <!-- new.html -->
    <div class = "container">
        <form action="{% url 'create' %}">  <!-- 이 부분!!! 중요!! -->
            <h4> 제목 : </h4>
            <input type = "text" name = "title">
            <br>
            <br>
            <h4> 본문 : </h4>
            <textarea cols=40 rows=10 name = "body"></textarea>
            <br>
            <br>
            <input class="btn btn-dark" type = "submit" vlaue = "제출하기">
        </form>
    </div>
    

    create 라는 url 주소로 보낸다!

     

  9. 그럼 path 지정이 안되었으니 url.py에서 해주자.

    # urls.py
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', blog.views.home, name = "home"),
        path('blog/<int:blog_id>', blog.views.detail, name = "detail"),
        path('blog/new', blog.views.new, name = "new"),
        path('blog/create', blog.views.create, name = "create"), # 이 녀석 추가!
    ]
    

    이제 form 태그 누르면 이 경로의 views.py안 함수가 실행된다!

     

  10. 그럼 create 함수를 만들어줘야 겠다!

    이 녀석의 역할은, 받은 정보를 DB에 넘겨주면 된다!

    # views.py
    def create(request):
        blog = Blog()
        blog.title = request.GET['title']
        blog.body = request.GET['body']
        blog.pub_date = timezone.datatime.now()
        blog.save()
        return 
    

    일단 여기까지 작성하고 설명을 들어보자.

     

    1. Blog라는 클래스로 부터 태어난 객체를 blog 라는 변수로 받아주자.

    2. 받은 객체의 title 인스턴스 변수에 form 태그로 넘긴 request 에서 title이라고 이름 매겨진 녀석을 GET 가져오자. 이건 request 객체의 메서드를 불러온 것

    3. 같은 방식으로 남은 두가지 인스턴스 변수도 적용해주자.

    4. pub_date는 시점을 넣어주는 함수! 사용하기 위해서는 다음이 필요하다. 모르면 나중에 쳐보자! 구글에

      # views.py
      from django.utils import timezone
      
    5. 마지막 저장은, 쿼리셋 메소드이다! 객체를 생성했을 때, 자동으로 만들어지는 기본 함수라 생각하면 편하다.

     

  11. 근데 어떤녀석을 return 해야 할까??

     

  12. 어떤 오류가 뜨는지 한번 보자. 서버를 켜!

     

  13. 띠용

    2019-02-26 10 09 32

    이건 무슨 에러일까?

    그런데 /admin 에 들어가면 블로그 객체는 생성된 걸 확인할 수 있다!

     

  14. 그럼 제출하고서 우리는 뭘 원하냐면, detail 페이지가 뜨길 원한다.

    그렇다면 이렇게 써주면 될거야!

    이걸 가능하게 하는게 redirect() 이다!

    # views.py
    from django.shortcuts import render, get_object_or_404, redirect
    from .models import Blog
    from django.utils import timezone
    
    
    def create(request):
        blog = Blog()
        blog.title = request.GET['title']
        blog.body = request.GET['body']
        blog.pub_date = timezone.datetime.now()
        blog.save()
        return redirect('/blog/' + str(blog.id))
    
    

    redirect 함수는, 이 url로 넘겨주세요! 라는 의미!

    그 안에는, 해당 녀석이 생긴 객체의 id로 바로 떠지기를 원하기 때문에 저런식으로 작성한다.

    str 을 쓴 이유는, url은 항상 문자형이기 때문이다!!

     

  15. 이제 완성됐다!

    서버를 돌려보자~

     

 

redirect, render의 차이

  • redirect

    URL을 입력하는 곳에 다른 URL을 넣을 수 있다!

    예를 들면 구글 창 같은거?

     

  • render

    함수안에서 막~ 처리한 것을 내가 보여준 창에서 처리하고 싶을 때 사용!

 

단순히 창을 띄우는 것이 목적이라면 redirect를 사용하자~

Comments