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개의 댓글

관련 채용 정보