Quiz的專案結構相當簡單,只需要建立測驗及結果的畫面,從quiz/urls.py來看:
1 2 3 4
| urlpatterns = [ path('play/', views.play), path('results/', views.answer_count), ]
|
測驗表單的畫面:
http://127.0.0.1:8000/quiz/

第一步:views
1 2 3 4 5
| # quiz/views.py from django.shortcuts import renderfrom .models import Question def play(request): question = Question.objects.all() return render(request, 'play.html', {'question':question})
|
藉由QuerySet取得所有題目question,再用render渲染play.html樣板。
第二步:template
先在template下新增play.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>The Easiest Harry Potter Quiz Ever</title> </head> <body> <div id="set" style="padding-top: 50px;"> ~The Easiest Harry Potter Quiz Ever~ </div><form action="" method="post"> <div style="padding-top: 60px;"> {% csrf_token %} {% for q in question %} <table> <tr> <td>{{ forloop.counter }}.{{q.question_text}}</td> </tr> {% for c in q.choice_set.all %} <tr> <td><input type="radio" name="{{ q.id }}" id="c-{{ forloop.counter }}"required>{{ c.choice_text }}</td> </tr> {% endfor %} </table> {% endfor %} <hr width="50%" align="left"> <input type="submit" value="submit"/> </div> </form> </body> </html>
|
-
loop在Django的固定寫法就是{% for %},一對大括號跟百分比,遞迴結尾要寫{% endfor %},否則會報錯。
-
"forloop.counter"為遞迴的次數,我拿它當作題目的序號。
-
{{q.question_text}}:在template,加上一個dot就可以得到你要的欄位。若要取得context裡的值,外面 要加個{{}},這是固定寫法。
-
{% for c in q.choice_set.all %}:透過"_set.all"可以得到ForeighKey相關的物件,在這邊取得了題目的四個選項。
-
當頁面為form表單提交時,一般都需要在form標籤中加上{% csrf_token %},因為在settings.py有一個預設防範CSRF的模組(MIDDLEWARE中的'django.middleware.csrf.CsrfViewMiddleware'),所以若沒有添加{% csrf_token %},在資料送出後會看到下面這個畫面:

小結:關於分數計算的部分明天繼續。