<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="note" />
</form>
1. <h1>은 제목처럼 사용하는 폰트 크기 지정
2. 에러가 있으면 굵은 글자로 화면에 보여준다.
3. form action 부분은 post 방식으로 데이터를 보내주는 구간이다.
아까 url 부분에서 vote라고 옆에 name=이름 지정해줬던거 기억나나? 그때 url app_name은 polls라고 지정하고
따라서 아까 vote라고 지정했던 /polls/7/vote 같은 형식의 url를 만들어서 post방식으로 보내주는 거다.
4. csrf_token 부분은 보안 측면에서 공격을 막는 기능이다.
5. for choice in question.choice_set.all은 question 객체에 있는 choice_set 속성에 들어 있는 항목 모두를 순회하는 거다.
6. radio버틍ㄴ으로 답변 항목을 보여주도록 한다.
7. forloop.counter는 for루프가 실행한 횟수를 담고 있는 템플릿 변수다. 얘는 장고에서 원래 제공하므로 우리가 따로 정의할 필요가 없다.
8. "vote"버튼을 클릭하면 사용자가 선택한 폼데이터가 post방식으로 polls:vote URL로 전송된다. 다음 절에서 살펴보겠지만 전송된 데이터는 vote()뷰함수에서 request.POST[choice]구문으로 엑세스한다. input태그의 name과 value 속성값들이 request.POST사전에 key, value로 사용된다.
Question과 Choice테이블의 관계는 1:N 관계고 외래키로 연결되어 있다. 1:N관계에서는 xxx_set속성을 디폴트로 제공한다. 그래서 question.choice_set.all()이라함은 question레코드에 연결된 choice테이블의 레코드 모두를 뜻한다. 앞의 detail.html예제에서는 템플릿 문법상 메소드 호출을 표시하는 ()를 사용하지 않으므로 question.choice_set.all이라고 표현한 것.
이제 view함수를 작성하자
from django.shortcuts import get_object_or_404, render
from polls.models import Question
# Create your views here.
def index(request):
latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question':question})
1. get_object_or_404단축함수는 render처럼 django.shortcuts에서 import한 함수로.
첫번째 인자는 Question과 같은 모델 클래스, 두번째 인자부터는 검색 조건을 사용한다. pk=question_id검색 조건에 맞는 객체를 조회하는 것이다. 만약 없다면 http404익셉션을 발생시킨다.
2. detail 뷰함수는 request와 question_id를 요구한다. request 객체는 필수 인자이고 question_id는 url패턴에서 정규표현식으로 추출한 question_id 파라미터다.
3. return 할때는 render함수를 사용하는데 템플릿 파일인 detail.html에 컨텍스트 변수를 적용하여 최종 html텍스트를 만들어 httpResponse객체로 반환한다. 템플릿에서는 question이라는 변수를 사용할 수 있게 된다.
'파이썬' 카테고리의 다른 글
admin사이트 제목 고치기 (0) | 2020.09.22 |
---|---|
admin.py 고치기 (0) | 2020.09.20 |
ch3 결과 polls (0) | 2020.09.20 |
vote() 뷰함수와 템플릿 (0) | 2020.09.20 |
urlconf 코딩해보기 (0) | 2020.09.20 |
admin에 테이블 등록해보기 (0) | 2020.09.19 |
MVT - Models 내용 (0) | 2020.09.19 |
프로젝트 생성전 = 뼈대 디렉토리 및 파일에 대한 설명 (0) | 2020.09.19 |