본문 바로가기

Python/Python(Django)

Django tutorial part3. 1/2 (화면 만들기)

1. polls/views.py 파일을 아래와 같이 작성한다.

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello. world. You're at the poll index.")


2. polls/urls.py 파일을 생성하고 아래와 같이 작성한다.

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('', 
                       url(r'^$', views.index, name = 'index')
                       )


3. mysite/url.py 파일을 아래와같이 수정한다.

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^polls/', include('polls.urls')),
)


※ 그러니까 정리하면 127.0.0.1:8000/polls/로 접속하면 polls.urls로 주소를 찾으로 들어가고, 주소 패턴이 없으면(r'^$') views.index를 실행시켜라 뭐 이런거??


※ url 패턴은 정규표현식(regular expression)을 사용한는데 자세한 내용은 http://en.wikipedia.org/wiki/Regular_expression



4. 실행해보자





5. 몇개의 view를 더 추가해 보자

polls/views.py를 아래와 같이 수정한다.

# Create your views here.
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello. world. You're at the poll index.")

def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

def results(request, poll_id):
    return HttpResponse("You're looking at the results of polls %s." % poll_id)

def vote(request, poll_id):
    return HttpResponse("You're voting on poll %s." % poll_id)



6. 조금더 복잡한 url 패턴을 정의해보자

polls/urls.py를 아래와 같이 수정

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('', 
#                        ex: /polls/
                       url(r'^$', views.index, name = 'index'),
#                        ex: /polls/5/
                       url(r'^(?P\d+)/$', views.detail, name='detail'),
#                         ex: /polls/5/results/
                       url(r'^(?P\d+)/results/$', views.results, name='results'),
#                        ex: /polls/5/vote/
                       url(r'^(?P\d+)/vote/$', views.vote, name='vote'),
                       )

※ 그러니까 (?P<poll_id>\d) 요 부분이 "poll_id 라는 파라미터(\d = 숫자 타입)를 입력 받는다" 라는 뜻



7. 결과를 확인해보자

http://127.0.0.1:8000/polls/5/


http://127.0.0.1:8000/polls/5/results/


http://127.0.0.1:8000/polls/5/vote/




8. DB를 읽어다가 화면에 뿌려보자

polls/view.py의 index 함수를 아래와 같이 수정한다.

- poll 테이블에 입력된값을 pub_date로 desc 정렬해서 5개만 불러온 다음에 중간중간 "," 를 삽입해서 출력하는 코드

from polls.models import Poll

def index(request):
#     return HttpResponse("Hello. world. You're at the poll index.")
    latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
    output = ', '.join(p.question for p in latest_poll_list)
    return HttpResponse(output)



9. 결과 화면





10. 템플릿(html)을 이용해서 출력해보자

polls/templates/polls/index.html 파일을 생성한다.

{% if latest_poll_list %}
    
{% else %}
    

No polls are available.

{% endif %}

음... if는 {% if %} {% endif %}

for는 {% for %} {% endfor %}

변수는 {{ 변수 }} 

형태인듯


그리고 /polls/{{ poll.id }}/ 경로는 결국 detail view를 의미하는거고 detail view는 urls.py 파일에 name = 'detail로 정의 되어 있다.'

따라서 

        
        
  • {{ poll.question }}
  • 이렇게 작성하는게 더 좋다.


    polls/views.py 파일의 index 함수를 수정해 보자

    from django.http import HttpResponse
    from polls.models import Poll
    from django.template import Context, loader
    
    def index(request):
    #     return HttpResponse("Hello. world. You're at the poll index.")
        latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
    #     output = ', '.join(p.question for p in latest_poll_list)
    #     return HttpResponse(output)
        template = loader.get_template('polls/index.html')
        context = Context({
                           'latest_poll_list' : latest_poll_list
                           })
        
        return HttpResponse(template.render(context))
    

    loader.get_template 로 템플릿을 가져와서 변수를 Context 에 담아서 render 해버리면 되는듯...

    좀더 간결한 형태로

    from django.template import Context
    from django.shortcuts import render
    
    def index(request):
        latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
        context = Context({
                           'latest_poll_list' : latest_poll_list
                           })
        
        return render(request, 'polls/index.html', context)
    

    이렇게 처리 할 수도 있다.



    11. 결과 확인








    반응형