From 485e78a6e2159b746212fb90ead7f6d61b44bab7 Mon Sep 17 00:00:00 2001
From: pedrolab <531310-pedrolab@users.noreply.gitlab.com>
Date: Mon, 20 Jul 2020 02:09:01 +0200
Subject: [PATCH] django tutorial #4 completed
---
.../mysite/polls/templates/polls/detail.html | 12 ++-
.../mysite/polls/templates/polls/results.html | 9 +++
pedro/django-tutorial/mysite/polls/urls.py | 7 +-
pedro/django-tutorial/mysite/polls/views.py | 79 +++++++++++++++----
4 files changed, 84 insertions(+), 23 deletions(-)
create mode 100644 pedro/django-tutorial/mysite/polls/templates/polls/results.html
diff --git a/pedro/django-tutorial/mysite/polls/templates/polls/detail.html b/pedro/django-tutorial/mysite/polls/templates/polls/detail.html
index 975db2a..3e55544 100644
--- a/pedro/django-tutorial/mysite/polls/templates/polls/detail.html
+++ b/pedro/django-tutorial/mysite/polls/templates/polls/detail.html
@@ -1,6 +1,12 @@
{{ question.question_text }}
-
+
+{% if error_message %}{{ error_message }}
{% endif %}
+
+
diff --git a/pedro/django-tutorial/mysite/polls/templates/polls/results.html b/pedro/django-tutorial/mysite/polls/templates/polls/results.html
new file mode 100644
index 0000000..bc78e2b
--- /dev/null
+++ b/pedro/django-tutorial/mysite/polls/templates/polls/results.html
@@ -0,0 +1,9 @@
+{{ question.question_text }}
+
+
+{% for choice in question.choice_set.all %}
+ - {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
+{% endfor %}
+
+
+Vote again?
diff --git a/pedro/django-tutorial/mysite/polls/urls.py b/pedro/django-tutorial/mysite/polls/urls.py
index 3e302ea..8aa1a75 100644
--- a/pedro/django-tutorial/mysite/polls/urls.py
+++ b/pedro/django-tutorial/mysite/polls/urls.py
@@ -6,11 +6,12 @@ from . import views
app_name = 'polls'
urlpatterns = [
# ex: /polls/
- path('', views.index, name='index'),
+ #path('', views.index, name='index'),
+ path('', views.IndexView.as_view(), name='index'),
# ex: /polls/5/
- path('/', views.detail, name='detail'),
+ path('/', views.DetailView.as_view(), name='detail'),
# ex: /polls/5/results/
- path('/results/', views.results, name='results'),
+ path('/results/', views.ResultsView.as_view(), name='results'),
# ex: /polls/5/vote/
path('/vote/', views.vote, name='vote'),
]
diff --git a/pedro/django-tutorial/mysite/polls/views.py b/pedro/django-tutorial/mysite/polls/views.py
index 257fe14..e9b70d9 100644
--- a/pedro/django-tutorial/mysite/polls/views.py
+++ b/pedro/django-tutorial/mysite/polls/views.py
@@ -2,10 +2,12 @@ from django.shortcuts import get_object_or_404, render
# Create your views here.
-from django.http import HttpResponse
+from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader
+from django.urls import reverse
+from django.views import generic
-from .models import Question
+from .models import Choice, Question
from django.http import Http404
@@ -30,12 +32,20 @@ from django.http import Http404
## meaningful, templated and easy to write index
## and then we no longer need to import loader and HttpResponse
-def index(request):
- latest_question_list = Question.objects.order_by('-pub_date')[:5]
- context = {
- 'latest_question_list': latest_question_list,
- }
- return render(request, 'polls/index.html', context)
+#def index(request):
+# latest_question_list = Question.objects.order_by('-pub_date')[:5]
+# context = {
+# 'latest_question_list': latest_question_list,
+# }
+# return render(request, 'polls/index.html', context)
+
+class IndexView(generic.ListView):
+ template_name = 'polls/index.html'
+ context_object_name = 'latest_question_list'
+
+ def get_queryset(self):
+ """Return the last five published questions."""
+ return Question.objects.order_by('-pub_date')[:5]
## simple detail
#def detail(request, question_id):
@@ -50,13 +60,48 @@ def index(request):
# return render(request, 'polls/detail.html', {'question': question})
## meaningful and easy to write detail
-def detail(request, question_id):
+#def detail(request, question_id):
+# question = get_object_or_404(Question, pk=question_id)
+# return render(request, 'polls/detail.html', {'question': question})
+
+## refactor detail view
+class DetailView(generic.DetailView):
+ model = Question
+ template_name = 'polls/detail.html'
+
+#def results(request, question_id):
+# response = "You're looking at the results of question %s."
+# return HttpResponse(response % question_id)
+
+# # real implementation of results
+#def results(request, question_id):
+# question = get_object_or_404(Question, pk=question_id)
+# return render(request, 'polls/results.html', {'question': question})
+
+# # refactor results view
+class ResultsView(generic.DetailView):
+ model = Question
+ template_name = 'polls/results.html'
+
+#def vote(request, question_id):
+# return HttpResponse("You're voting on question %s." % question_id)
+
+
+# #real implementation of vote
+def vote (request, question_id):
question = get_object_or_404(Question, pk=question_id)
- return render(request, 'polls/detail.html', {'question': question})
-
-def results(request, question_id):
- response = "You're looking at the results of question %s."
- return HttpResponse(response % question_id)
-
-def vote(request, question_id):
- return HttpResponse("You're voting on question %s." % question_id)
+ try:
+ selected_choice = question.choice_set.get(pk=request.POST['choice'])
+ except (KeyError, Choice.DoesNotExist):
+ # Redisplay the question voting form.
+ return render(request, 'polls/detail.html', {
+ 'question': question,
+ 'error_message': "You didn't select a choice.",
+ })
+ else:
+ selected_choice.votes += 1
+ selected_choice.save()
+ # Always return an HttpResponseRedirect after successfully dealing
+ # with POST data. This prevents data from being posted twice if a
+ # user hits the Back button
+ return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))