Web /Django

Django view 작성하기

백곳 2017. 8. 11. 19:34

Django view 작성하기


polls/views.py

def detail(request,question_id):
    return HttpResponse("You 're looking at question %s "% question_id")

def results(request,question_id):
    return HttpResponse(response % question_id)

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


코드를 추가해 줍니다. 


polls  모듈에 view를 추가하기 위해서 

polls/urls.py


from django.conf.urls import url 
from . import views
 
urlpatterns = [

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

    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),

]


브라우저에 “/polls/34/” 를 입력해 보세요. 이 주소에 접속하면 detail() 함수를 호출하여 URL 에 입력한 ID 를 출력할 것입니다. “/polls/34/results/” 와 “/polls/34/vote/” 도 실행해 보세요. 투표 결과와 투표 페이지의 뼈대가 되는 페이지가 출력될 것입니다.


사용자가 웹사이트의 페이지를 요청할때, (“/polls/34” 를 입력했다고 가정하겠습니다.) Django 는 mysite.urls 모듈을 불러옵니다. ROOT_URLCONF 설정에 의해 설정되어 있기 때문입니다. mysite.urls 에서 urlpatterns 이라는 변수를 찾아, 정규표현식을 순서대로 따라갑니다. '^polls/' 를 찾은 후, 일치하는 문자열("polls/")을 버립니다. 이후 남은 문자인 "34/" 를 polls.urls URLconf 에게 전달하여 남은 처리를 진행합니다. 이제 r'^(?P<question_id>[0-9]+)/$' 에 패턴이 일치하고, 그 결과로 detail() 함수가 호출됩니다.


detail(request=<HttpRequest object>, question_id='34')


question_id='34' 부분은 (?P<question_id>[0-9]+) 에서 왔습니다. 패턴을 괄호로 감싸 일치하는 패턴의 문자열을 잡아낸 후, 이를 view 함수의 인수로서 넘깁니다. ?P<question_id> 는 일치하는 패턴을 구별하기 위해 정의한 이름입니다. 그리고 [0-9]+ 는 연속된 숫자의 나열을 잡아내기 위한 정규 표현식입니다.

 ?P<question_id>은 정표 표현식이라기보단 django 플랫폼의 문법 정도로 보시고 

[0-9]+ 이부분만 정규 표현식으로 보시면 됩니다. 


View 로 간단한 동작 


이번에는 view 에서 먼가 작동을 하도록 소스를 수정하겠습니다. 


Question에 들어가 갑니다. 


버튼을 눌러 



이런식으로 총 5개를 만들어 줍니다, 


이렇게 되면 데이터베이스도 연동됩니다,


이제 http://10.23.10.232:8888/polls/ 이렇게 접속하면 


what question5,what question4,what question3,what question2,what question1


이런 문구가 나오게 하려고 합니다. 


polls/views.py

def index(request):

    latest_question_list = Question.objects.order_by('-pub_date')[:5]
   # pub_date 필드의 날짜 순서 대로 배열로 Question object을 가져 옵니다.
    outputdatalist = []
   # outputdatalist 에다 순서대로 문자열 배열을 만들어 줍니다.
    for q in latest_question_list:
        outputdatalist.append(q.question_text)
   # join을 통하여 ","로 배열을 구분자가 있는 String 형식으로 만들어 줍니다. 
    output_data = ",".join(outputdatalist)
   # HttpResponse 로 출력 해줍니다. 
    return HttpResponse(output_data)

모든 Django 는 HttpResponse 객체나, 혹은 예외(exception) 를 원합니다.


$sudo service apache2 restart



위와 같은 결과를 얻을수 있습니다.