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을 짝패처럼 기억하자.

0개의 댓글