참고:
[Web Applicateion]서버 사이드와 클라이언트 사이드,백앤드와 프론트앤드
pip install django로 반드시 장고를 설치하여야한다.
또한 장고의 버전은 2이므로 1을 사용하는 사람들의 경우 서로 많이 차이날 수 있다는 점을 잘 알고 접근하여야 한다.
이제까지 모델을 만들어 봤으니 이제 그 model을 templates로 출력하는 것을 한번 해보도록하자.
model을 출력하기 위해서는 일단 url부터 등록해주자.
# applications urls.py
from django.urls import path
from . import views
urlpatterns = [
path('person-test/', views.person_test, name='person-test'),
]
어플리케이션단의 url을 다음과 같이 등록을 해준다.
물론 해당 url을 등록하기 위해서는 views에 해당 메소드가 존재해야한다.
그 메소드를 만들기 앞서 프로젝트단의 url역시 수정해주자.
# project urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('dj/', include('dj.urls')),
]
사실 여러분이 해놓은 작업도에 따라서 수정을 할 필요가 없을 수도 있다.
이로 인하여 여러분은 localhost:<포트번호>/<어플리케이션명>/person-test로 접근할 수 있다.
# views.py
from django.shortcuts import render
from .models import Person
# Create your views here.
def person_test(request):
person_list = Person.objects.order_by('-name')
context = {'person_list': person_list}
return render(request, 'dj/index.html', context)
이 코드는 매우 간결하면서도 모델에 있는 객체를 가져올 수 있는 매운 쉬운 방법이다.
특정 model에 objects.order_by를 사용하면 해당 모든 레코드를 가져올 수 있다.
여기서 order_by를 비워둔다면 자동으로 primary key를 통하여 가져온다.
위의 경우 정렬순을 -name이라고 하였는데 이러면 name이라는 컬럼의 역순으로 가져오게 된다.
어쨋던 가져온 데이터를 context라는 변수에 딕셔너리로 넣는데 person_list라는 변수안에 넣게 된다.
물론이지만 변수의 이름은 여러분이 마음대로 정해도 된다.
이제 렌더링을 하기 위해서는 템플릿파일이 필요하다.
이 파일의 위치는 여러분이 기억하는가?
프로젝트의 어플리케이션의 templates밑에 어플리케이션으로 또 네임스페이싱을 한다음 해당 template파일을 넣는다.
이 templates파일의 경로는 당연히 settings.py에 추가되어있어야한다.
무슨말인지 모르겠으면 django1장을 참조하라.
이제 index.html을 꾸며주자.
{# dj/index.html #}
{% if person_list %}
<ul>
{% for person in person_list %}
<li><a href="/dj/person-test/{{ person.id }}/">{{ person.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
django template 엔진에 대해서 모르는 사람이 있을 수 있다.
{% %}는 파이썬의 지시자가 들어갈 수 있다. if나 for 같은 애들이다.
if의 경우 해당 변수가 있는지를 확인한다.
없으면 endif까지의 코드를 실행하지 않는다.
그 외에는 다 알아들을 수 있을 것이다.
그럼 실행결과는 어떻게 될까?
보다시피 Person object는 필자의 경우 미리 3개를 만들었다.
python코드를 쓰던 shell을쓰던 django admin을 쓰던 알아서 방법을 채택하라.
실행하면 위와 같이 데이터들이 나오면 정렬은 name을 기준으로 역순(-)정렬 됬음을 알 수 있다.
정순 정렬을 하고싶다면 아래와 같다.
해당은 name으로 사용한 값이다.
해당 anchor를 눌려봤자 페이지 이동시 에러가 난다.
해당 url을 우리가 만들어준 기억이 없기 때문이다.
이를 테스트하기위하여 url과 view를 추가로 제작해야할 필요성이 있다.
# applications urls.py
from django.urls import path
from . import views
urlpatterns = [
path('person-test/', views.person_test, name='person-test'),
path('person-test/<int:pid>/', views.person_test_detail, name='person-test-id')
]
어플리케이션단의 urls을 다음과같이 추가해준다.
여기서 중요한건 name이 겹치면 안된다. 이는 일종의 식별자로써 중복되서 안되기 때문이다.
경로를 보면 두번째 경로가 변수 pid로 등록된것을 알 수 있다.
이는 매우 중요한데 index.html에서 각각의 누른 경로가 해당 url로 연결되게 매핑이 된다.
# views.py
from django.shortcuts import render
from .models import Person
# Create your views here.
def person_test(request):
person_list = Person.objects.order_by('-name')
context = {'person_list': person_list}
return render(request, 'dj/index.html', context)
def person_test_detail(request, pid):
person = Person.objects.get(pk=pid)
context = {'person': person}
return render(request, 'dj/detail.html', context)
이제 view로직에도 추가를 해주자.
여기서는 위에 추가한 url이 해당 경로로 인도되게 하는 효과가 있다.
person_test_detail의 두번째 파라메터를 위의 url에서 선언했던 pid를 사용한다.
그리고 하나의 object를 가져올때 쓰는 get메소드를 사용해서 pk=pid로 해주면
pk는 중복이 되지 않으므로 오직 하나의 값만을 가져올 수 있다.
여기서 렌더링할때는 detail.html이라는 페이지와 연결되게 해준다.
그러므로 우리는 detail.html을 만들 필요성이 존재하게 된다.
{# detail.html #}
id = {{ person.id }}<br>
name = {{ person.name }}<br>
birth = {{ person.birth }}<br>
age = {{ person.age }}<br>
여러분에게 맞게 알아서 코딩을 하자.
detail.html의 코딩은 여러분이 확인하고 싶은 데이터를 추려서 확인해주면 된다.
이제 실행을 시킨후 테스트를 해보자.
다시 테스트를 할 수 있다.
여기까지는 변한게 없다.
이제 눌러서 테스트 해보자.
해당 정보가 뜨는걸 확인할 수 있다.
이까지 했으면 다 했긴한데 더 편하기 위해서 하나만 확인해보자.
{# dj/index.html #}
{% if person_list %}
<ul>
{% for person in person_list %}
<li><a href="/dj/person-test/{{ person.id }}/">{{ person.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
이 코드에서 보면 anchor태그 부분에 url이 하드코딩 되어있다.
사실 이러한 코드는 바람직하지 않다.
왜냐하면 경우에 따라서 url이 바뀌는 경우가 많기 때문이다.
따라서 url을 하드코딩하지 않고 djnago template 엔지을 사용해서 매핑하는 방법이 있다.
{# dj/index.html #}
{% if person_list %}
<ul>
{% for person in person_list %}
<li><a href="{% url 'person-test-id' person.id %}">{{ person.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
url태그를 사용해서 우리가 정한 name을 사용해주면 그 name을 찾아가서 매핑이 된다.
이 방법을 사용하면 만약 url이 바뀌더라도 알아서 매핑이 되기 때문에 편하게 사용할 수 있다.
만약 해당 name이 한개라면 위와 같이 매핑을 할 수 있다.
문제는 해당 name이 여러개인 경우이다. 이 경우에는 어떻게 할까?
여기서 이때까지 우리가 항상 폴더에 넣어두었던 진가가 발휘 된다.
이 경우 우리가 이때까지 이상하게해두었던 네임스페이싱을 사용해서 접근을 하면된다.
# applications urls.py
from django.urls import path
from . import views
app_name = 'dj'
urlpatterns = [
path('person-test/', views.person_test, name='person-test'),
path('person-test/<int:pid>/', views.person_test_detail, name='person-test-id')
]
어플리케이션단의 urls.py를 보면 아시겠지만 app_name부분만 추가했다.
이 app_name을 dj라고 하자.
이제 준비는 1단계를 마쳤다. 2단계를 실시하도록 하자.
{# dj/index.html #}
{% if person_list %}
<ul>
{% for person in person_list %}
<li><a href="{% url 'dj:person-test-id' person.id %}">{{ person.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
해당 url에 app_name을 붙혀서 선언해주자.
앞으로 이러한 습관을 들이는게 좋다.
그렇게 해야 하드코딩을 막고 네임스페이싱 되어서 코드의 중복을 막을 수 있기 때문이다.
'Programming > Python-Django' 카테고리의 다른 글
[Django-08]form과 model연결 (0) | 2018.02.03 |
---|---|
[Django-07]form만들기 (0) | 2018.02.03 |
[Django-05]db와 model 사용하기 (0) | 2018.02.03 |
[Django-04]http response (0) | 2018.01.30 |
[Django-03]간단한 페이지 만들기(MTV패턴) (0) | 2018.01.23 |