1)
pagination 등의 기능을 사용하기 위해 bootstrap4를 인스톨하는 과정에서 장고를 3.0에서 3.2로 업그레이드 했다. 그리고 settings.py의 INSTALLED_APPS 부분에 bootstrap4를 추가해주었다.
2)
{% load bootstrap4 %}
<!doctype html>
<html lang="ko">
<head>
...
</head>
<body>
<form action="" method="get">
<input type="text" name="q" value={{ q }} />
<input type="submit" value="검색" />
</form>
<table class="table table-bordered table hover">
...
</table>
{% bootstrap_pagination page_obj %}
</body>
<html>
템플릿의 시작 부분에 '{% load bootstrap4 %}'를 명시해주고 ^body^가 끝나기 전에 구현하려는 기능을 적용해주었다.
상속 받은대로 'page_obj'를 넘겨줬으나 함수뷰로 구현돼서 오류가 발생하는 관계로 'if is_paginated'로 임시 처리해주었다.
3)
@login_required는 장식자로 사용될 때 실질적 데코레이터인 user_passes_test 함수를 호출한다.
장식자는 크게 장식자의 이름과 장식자 안에 들어가는 함수 그리고 호출되는 함수를 감사는 wrapping 함수의 시작과(def) 끝(return)으로 이루어져있다고 생각할 수 있다.
'''
@login_required
def func1
'''
라고 표현하긴 하지만,
'''
def func1
func1 = login_required(func1)
'''
로 표현할 수도 있다는 점에서 우리가 이해하기에 "장식자를 건다."는 부분이 사실 "장식자 함수에 넣어서 wapper 함수에 끼워버린다."로 해석될 수 있다.전자는 함수와 클래스만을 장식할 수 있고 후자는 더 다양한 요소들을 장식할 수 있다고 한다.
4)
url reverse를 수행하는 경우는 reverse, resolve_url, redirect 그리고 템플릿 url 태그가 있다. 템플릿 url태그와 resolve_url은 reverse를 내부적으로 이용한다.
redirect는 resolve_url에 몇 가지 기능을 첨가한 것인데 reverse와 resolve_url이 'url 문자열'을 넘겨주는 것과 달리, http instance를 생성한다고 한다. 301이나 302에 해당하는 HttpResponse이다.
5)
class Item(models.Model):
...
def get_absolute_url(self):
return reverse('gallery:item_detail', args=[self.pk])
+
<a href="{% url 'gallery:item_detail' item.pk %}">
+
<a href="{{ item.get_absolute_url }}}">
resolve_url은 들어온 패턴 네임(to)을 분석해서 'get_absolute_url'이란 attribute가 있다면 패턴네임에 대한 해당 함수를 호출할 것이다. 이를 모델 클래스에 구현해서 템플릿에서 더 간단한 코딩을 구현해보았다.
그리고 모델 클래스에 get_absolute_url이 구현된다면
resolve_url('blog:item_detail, pk=item.pk')
가 아닌
resolve_url(item)
또한 가능하다.
그러므로 DetailView와 get_absolute_url을 짝패처럼 기억하자.