ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django 초간단 게시판 5. templates
    Python/초간단 장고 Django 2021. 5. 28. 02:31
    반응형

    폴더 경로가 board/templates/board/*.html 이러 하다. 

    board 아래에 또 board가 있는 이유는 네임스페이스로 사용하기 위해서이다. 
    다른 앱에 이름이 같은 파일이 있다면 장고가 오동작할 수 있다. 
    네임 스페이스가 이를 막아준다. 

     

    장고의 클래스 뷰를 이용하면 자동으로 파일명이 정해진다. 
    물론 별도의 파일명을 지정할 수 있지만...
    한 줄이라도 더 줄이기 위해 디폴트 값으로.. 

     

    article_detail.html

    디테일 뷰의 템플릿이다. 

    클래스 뷰에서 속성으로 지정되었던 모델의 내용이
    object 객체에 담겨 전달된다. 
    객체의 이름(object)은 바꿀 수 있지만 한 줄이라도 줄이자...

    {{}} 여기에 변수를 담는다. 

    <!--board/templates/board/article_detail.html-->
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>{{object.title}}</title>
    </head>
    <body>
        <p>title: {{object.title}}</p>
        <p>author: {{object.author}}</p>
        <p>content: {{object.content}}</p>
        <p>created_at: {{object.created_at|date:'Y-m-d, H:i'}}</p>
        <p>modified_at: {{object.modified_at|date:'Y-m-d, H:i'}}</p>
        <div>
            <a href="{% url 'update' object.id %}">수정</a>
            <a href="{% url 'delete' object.id %}">삭제</a>
            <a href="{% url 'index' %}">목록</a>
        </div>
    </body>
    </html>

    |date:'Y-m-d, H:i' 는 템플릿 필터다. 
    https://ssungkang.tistory.com

     

    article_list.html

    {% %} 에는 조건문 반복문 등을 담는다. 

    object_list에 리스트가 담겨 있다. 

    <!--board/templates/board/article_list.html-->
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {% if object_list %}
        <ul>
            {% for each in object_list %}
            <li>
                {{each.id}} [{{each.author}}]
                <a href="{% url 'detail' each.id%}">{{ each.title }}</a>
                [{{each.created_at|date:'Y-m-d, H:i'}}]
            </li>
            {% endfor %}
        </ul>
        {% else %}
        <p>목록이 비었습니다.</p>
        {% endif %}
    
        {% if is_paginated %}
        <ul>
            {% if page_obj.has_previous %}
            <li><a href="?page={{ page_obj.previous_page_number }}">&laquo;</a></li>
            {% else %}
            <li><span>&laquo;</span></li>
            {% endif %}
    
            {% for i in paginator.page_range %}
                {% if page_obj.number == i %}
            <li><span>{{ i }} <span>(current)</span></span></li>
                {% else %}
            <li><a href="?page={{ i }}">{{ i }}</a></li>
                {% endif %}
            {% endfor %}
            {% if page_obj.has_next %}
            <li><a href="?page={{ page_obj.next_page_number }}">&raquo;</a></li>
            {% else %}
            <li><span>&raquo;</span></li>
            {% endif %}
        </ul>
        {% endif %}
        <div><a href="{% url 'create' %}">글 등록</a></div>
    </body>
    </html>

    주소를 만들 때는 {% uri 'urls.py에서 지정한 별명' 전달값 %} 이다. 
    전달할 게 없으면 전달값은 생략 가능.

     

    article_form.html

    생성과 수정은 같은 폼을 사용한다.

    <!--board/templates/board/article_form.html-->
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form method="post">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="저장">
        </form>
    </body>
    </html>

    {% csrf_token %}는 CSRF(Cross Site Request Forgery) 공격을 막기 위한 장치이다. 

    장고는 폼도 자동으로 만들어준다. =  form.as_p, form.as_table
    <p></p>, 또는 <table></table>을 이용...

     

    article_confirm_delete.html

    특별한 것은 없다. 

    <!--board/templates/board/article_confirm_delete.html-->
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form method="POST">
            {%csrf_token%}
            {{object}}를 삭제할까요?
            <input type="submit" value="삭제">
        </form>
    </body>
    </html>

     

    ------------------

    초간단이기 때문에 
    디자인은 다루지 않습니다. 

    익명 게시판 정도 완성했네요. 
    아무나 글을 수정하고 지울 수 있는 문제를 해결해야 하지만....

    읽어주셔서 감사합니다.

    반응형
Designed by Tistory.