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'를 템플릿으로 넘겨주지 않았지만, 이번에 추가해 줌)