1)

어떤 페이지가 요청되면 django는 해당 요청의 metadata를 포함하는 httprequest를 생성하고 이를 적절한 view function에 첫번 째 인자로 넘겨준다.

GET, POST,FILES 등의 함수는 django/http/request.py에서 확인할 수 있는 바, HttpRequest 클래스의 초기화 메소드 __init__ 아래 정의돼있다. 이 셋은 QueryDict 혹은 MultipleValueDict 클래스를 통해서 query string을 반환한다.

2)

def item_list(request):
    qs = Item.objects.all()
    q = request.GET.get('q', '')
    if q:
        qs = qs.filter(subject_icontains = q)
    return render(request, 'gallery/item_list.html', {
        'item_list': qs,
    })

gallery 앱의 views.py에 정의해준 item_list 함수는 request를 첫번 째 인자로 받는다. 프로젝트 폴더의 urls.py가 django/urls/conf.py에 정의된 _path 함수를 사용하고, 이 함수가 불러오는 View 클래스의 view 메소드에서 request를 반환한다. 이는 django/views/generic/base.py에서 확인 가능하다.

get()의 경우에는 'q'라는 인자를 던지거나 없으면 None을 던지지만, ''로 커스터마이징 해주었다.

경로로 설정한 부분은 gallery/templates 아래 저장되고, 세번 째 인자라고 할 수 있는 dict 안에 있는 부분은 "템플릿 상에서 qs를 'item_list'라는 이름으로 사용하겠다." 정도의 의미라고 생각하면 된다.

render()는 loader.render_to_string()으로 템플릿을 문자열화한 후 이를 content란 이름으로 HttpResponse에 담아 반환한다.

3)

from django.urls import path
from . import views

urlpatterns=[
    path('', views.post_list),
]

프로젝트 폴더의 urls.py에서 incldue한 gallery 앱의 urls.py는 path와 현재 디렉토리의 views를 import해서 아무 경로도 지정하지 않은 경우, views에 정의된 함수를 넘겨준다.

4)

<!doctype html>
<html lang="ko">
<head>
    <meta charset="utf-8" />
    <title> Instagram / Item List </title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

</head>  
<body>

    <form action="" method="get">
        <input type="text" name="q" />
        <input type="submit" value="검색" />  
    </form>

    <table class="table table-bordered table hover">
        <tbody>
            {% for item in item_list %}
                <tr>
                    <td>
                        {% if post.photo %}
                            <img src="{{ post.photo.url }}" style="width: 100px;" />
                        {% else %}
                            No Photo
                        {% endif %}
                    </td>
                    <td>
                        {{item.subject}}
                    </td>
                    <td>
                        {{item.price}}
                    </td>
                    <td>
                        {{item.size}}
                    </td>    
                </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
<html>

템플릿 파일을 작성하기 위한 기본 준비는 다음과 같은데 윗 부분은 대략 "html 5.0을 사용하겠다.", "한국어를 사용하겠다.", "utf-8 인코딩을 사용하겠다."의 선언이다.

tr은 한 행, td는 한 칸을 뜻한다.

head에 css cdn을 붙여넣고 table에 class를 입력해서 bootstrap을 적용해주었다.

form은 내부 코딩을 action에 기입된 주소에 method에 지정한 방식으로 전달하는 명령어이다. action이 빈 문자열을 전달하는데 웹에서 이는 상대경로를 의미한다. 따라서 views에서 get()으로 넘어가는 q는 form 내부에서 전달돼서 다시 템플릿으로 돌아오는 셈이다.(최초 views.py에서는 'q'를 템플릿으로 넘겨주지 않았지만, 이번에 추가해 줌)

0개의 댓글